Introductie
Logrotate is een systeemhulpprogramma dat de automatische rotatie en compressie van logbestanden beheert. Als logbestanden niet worden geroteerd, gecomprimeerd en periodiek worden opgeschoond, kunnen ze uiteindelijk alle beschikbare schijfruimte op een systeem gebruiken.
Logrotate is standaard geïnstalleerd op Ubuntu 22.04 en is ingesteld om te voorzien in de behoeften van logrotatie van alle geïnstalleerde pakketten, inclusief rsyslog
, de standaard systeemlogprocessor.
In dit artikel zullen we de standaard Logrotate-configuratie verkennen en vervolgens logrotatie configureren voor een fictieve aangepaste applicatie.
Vereisten
Deze zelfstudie gaat ervan uit dat u een Ubuntu 22.04-server heeft, met een niet-root sudo-geactiveerde gebruiker, zoals beschreven in Initiële serverinstellingen met Ubuntu 22.04.
Logrotate is ook beschikbaar op veel andere Linux-distributies, maar de standaardconfiguratie kan behoorlijk verschillen. Andere delen van deze zelfstudie zijn nog steeds van toepassing, zolang uw versie van Logrotate vergelijkbaar is met die van Ubuntu 22.04. Volg Stap 1 om uw Logrotate-versie te bepalen.
Log in op uw server als uw sudo-geactiveerde gebruiker om te beginnen.
Stap 1 – Bevestigen van uw Logrotate-versie
Logrotate is standaard geïnstalleerd op Ubuntu. Als u het echter moet installeren, voer dan de volgende opdrachten uit om uw pakketlijst bij te werken en het pakket op te halen:
Als u een niet-Ubuntu-server gebruikt, zorg er dan eerst voor dat Logrotate is geïnstalleerd door om de versie-informatie te vragen:
Outputlogrotate 3.19.0
Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes
Als Logrotate is geïnstalleerd maar het versienummer aanzienlijk verschilt, kunt u problemen hebben met sommige van de configuratieopties die in deze zelfstudie worden verkend. Raadpleeg de documentatie voor uw specifieke versie van Logrotate door de handleiding (man
-pagina) te lezen:
U kunt ook de online versie van de Logrotate-documentatie raadplegen. Vervolgens zullen we kijken naar de standaard configuratiestructuur van Logrotate op Ubuntu.
Stap 2 – Verkennen van de Logrotate-configuratie
De configuratie-informatie van Logrotate is over het algemeen te vinden op twee plaatsen op Ubuntu:
/etc/logrotate.conf
: dit bestand bevat enkele standaardinstellingen en stelt rotatie in voor een paar logs die niet eigendom zijn van systeempakketten. Het gebruikt ook eeninclude
-verklaring om configuratie in te laden vanuit elk bestand in de/etc/logrotate.d
-directory./etc/logrotate.d/
: hier plaatsen alle pakketten die je installeert en die hulp nodig hebben bij logrotatie hun Logrotate-configuratie. Op een standaardinstallatie zouden hier al bestanden moeten staan voor kernsysteemtools zoalsapt
,dpkg
,rsyslog
, enzovoort.
Standaard configureert logrotate.conf
wekelijkse logrotaties, met logbestanden die eigendom zijn van de root-gebruiker en de syslog-groep, waarbij vier logbestanden tegelijk worden behouden (rotate 4
), en nieuwe lege logbestanden worden aangemaakt nadat het huidige is geroteerd (create
).
Laten we eens kijken naar het Logrotate-configuratiebestand van een pakket in /etc/logrotate.d
. Gebruik cat
om het bestand voor het apt
-pakketprogramma te bekijken:
Output/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
Dit bestand bevat configuratieblokken voor twee verschillende logbestanden in de /var/log/apt/
-directory: term.log
en history.log
. Ze hebben beide dezelfde opties. Alle opties die niet zijn ingesteld in deze configuratieblokken zullen de standaardwaarden erven of die ingesteld zijn in /etc/logrotate.conf
. Elke instelling in een logrotate-bestand zal de standaardwaarden van logrotate overschrijven, die geconfigureerd zijn in /etc/logrotate.conf
. De ingestelde opties voor de apt
-logs zijn:
rotate 12
: behoud twaalf oude logbestanden. Dit overschrijft de standaardrotate 4
.monthly
: roteer eenmaal per maand. Dit overschrijft de standaardwekelijks
.compress
: comprimeer de geroteerde bestanden. Dit gebruikt standaardgzip
en resulteert in bestanden met de extensie.gz
. Het compressiecommando kan worden gewijzigd met decompresscmd
-optie.missingok
: schrijf geen foutmelding als het logbestand ontbreekt.notifempty
: roteer het logbestand niet als het leeg is.
Deze configuratiebestanden erven ook het standaard create
-gedrag, wat Logrotate instrueert om nieuwe logs te maken na rotatie. Dit kan worden overschreven met nocreate
, hoewel dat effectief de meeste andere functionaliteit uitschakelt.
Er zijn nog veel meer configuratieopties beschikbaar. U kunt erover lezen door man logrotate
in te typen op de opdrachtregel om de handleiding van Logrotate op te roepen.
Vervolgens zullen we een configuratiebestand instellen om logs te behandelen voor een fictieve service genaamd your-app
.
Stap 3 – Het opzetten van een voorbeeldconfiguratie
Om logbestanden te beheren met logrotate voor toepassingen buiten de voorgeïnstalleerde en voorgeconfigureerde systeemservices, hebben we twee opties:
- Maak een nieuw Logrotate-configuratiebestand aan en plaats het in
/etc/logrotate.d/
. Dit wordt dagelijks uitgevoerd als de root-gebruiker samen met alle andere standaard Logrotate-taken. - Maak een nieuwe configuratie aan en voer deze uit buiten de standaard Logrotate-setup van Ubuntu. Dit is alleen echt nodig als je Logrotate als een niet-root-gebruiker moet uitvoeren, of als je de logs vaker dan dagelijks wilt roteren (een
hourly
-configuratie in/etc/logrotate.d/
zou ineffectief zijn, omdat de Logrotate-setup van het systeem slechts één keer per dag wordt uitgevoerd).
Laten we deze twee opties doorlopen met enkele voorbeeldinstellingen.
Configuratie toevoegen aan /etc/logrotate.d/
We willen de logrotatie configureren voor een fictieve webserver die een access.log
en error.log
plaatst in /var/log/your-app/
. Het draait als de www-data
gebruiker en groep.
Om een configuratie toe te voegen voor de logbestanden van your-app
naar /etc/logrotate.d/
, open eerst een nieuw bestand in de map /etc/logrotate.d
met nano
of je voorkeurseditor:
Voeg de volgende regels toe aan je nieuwe configuratiebestand:
/var/log/your-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload your-app
endscript
}
Enkele van de nieuwe configuratierichtlijnen in dit bestand zijn:
create 0640 www-data www-data
: dit maakt een nieuw leeg logbestand na rotatie, met de gespecificeerde rechten (0640
), eigenaar (www-data
), en groep (ookwww-data
).sharedscripts
: deze vlag betekent dat eventuele scripts die aan de configuratie zijn toegevoegd, slechts één keer per uitvoering worden uitgevoerd, in plaats van voor elk geroteerd bestand. Aangezien het pad/var/log/your-app/*.log
een jokerteken*
bevat, zou deze configuratie overeenkomen met elk aantal logbestanden in de mapyour-app
. Zonder desharedscripts
-optie zou het opgegeven script inpostrotate
telkens worden uitgevoerd wanneer logrotate een logbestand verwerkt zonder deze optie.postrotate
totendscript
: dit blok bevat een script dat wordt uitgevoerd nadat het logbestand is geroteerd. In dit geval herladen we onze voorbeeldtoepassing. Dit is soms nodig om uw toepassing over te laten schakelen naar het nieuw aangemaakte logbestand.
Merk op datpostrotate
wordt uitgevoerd voordat logs worden gecomprimeerd. Compressie kan lang duren, en uw software moet onmiddellijk overschakelen naar het nieuwe logbestand. Voor taken die moeten worden uitgevoerd nadat logs zijn gecomprimeerd, gebruik hetlastaction
-blok in plaats daarvan.
Om op te slaan en af te sluiten in nano
, druk op Ctrl+X
, en wanneer gevraagd, Y
en dan Enter
. U kunt de configuratiebestand testen door een proefrun te doen:
Deze opdracht roept logrotate
aan, wijst het naar het standaard configuratiebestand, en schakelt de debugmodus in.
Informatie zal worden afgedrukt over welke logbestanden Logrotate behandelt en wat het ermee zou hebben gedaan. Als alles er goed uitziet, ben je klaar. De standaard Logrotate-taak wordt één keer per dag uitgevoerd en omvat je nieuwe configuratie.
Vervolgens zullen we een opstelling proberen die helemaal geen gebruik maakt van de standaardconfiguratie van Ubuntu.
Stap 4 — Het maken van een onafhankelijke Logrotate-configuratie
In dit voorbeeld hebben we een app die draait als onze gebruiker sammy
, die logs genereert die worden opgeslagen in /home/sammy/logs/
. We willen deze logs elk uur roteren, dus moeten we dit buiten de structuur van /etc/logrotate.d
instellen die door Ubuntu wordt geleverd.
Eerst maken we een configuratiebestand in onze thuismap. Open het in een teksteditor:
Plak vervolgens de volgende configuratie:
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
Sla het bestand op en sluit het. We zijn al deze opties tegengekomen in eerdere stappen, maar laten we samenvatten: deze configuratie zal de bestanden elk uur roteren, comprimeren en vierentwintig oude logs behouden en een nieuw logbestand maken om het geroteerde bestand te vervangen.
Je moet de configuratie aanpassen aan jouw toepassing, maar dit is een goed begin.
Om te testen of de configuratie werkt, laten we een logbestand maken. Ga eerst naar de thuismap van je gebruiker met het commando cd ~
. Maak vervolgens een map aan voor de logs met het mkdir
-commando. Maak tot slot een leeg bestand aan in de map logs
met het touch
-commando. Voer de volgende commando’s uit om deze stappen te voltooien:
Nu we een leeg logbestand op de juiste plek hebben, laten we het logrotate
-commando uitvoeren.
Omdat de logs eigendom zijn van sammy
, hoeven we geen sudo
te gebruiken. We moeten echter wel een staat-bestand opgeven. Dit bestand registreert wat logrotate
heeft gevonden en welke acties het de vorige keer heeft ondernomen, zodat het weet wat het de volgende keer moet doen. Deze status tracking wordt voor ons afgehandeld bij gebruik van de standaard /etc/logrotate.conf
-configuratie. Het statusbestand wordt opgeslagen in /var/lib/logrotate/status
. Aangezien we de standaardconfiguratie niet gebruiken, moeten we de locatie van het statusbestand handmatig configureren.
We laten Logrotate het statusbestand voor dit voorbeeld direct in onze thuismap plaatsen. Het kan overal worden geplaatst dat toegankelijk en handig is. Voer het volgende commando uit om de /home/sammy/logrotate.conf
te gebruiken die je hebt gemaakt en om de status die logrotate tegenkomt vast te leggen:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Outputreading config file /home/sammy/logrotate.conf
Handling 1 logs
rotating pattern: /home/sammy/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/sammy/logs/access.log
log does not need rotating
De --verbose
-vlag zal gedetailleerde informatie afdrukken over wat Logrotate aan het doen is. In dit geval heeft het niets geroteerd. Dit is de eerste keer dat Logrotate dit logbestand tegenkomt en het is nul uur oud, dus het hoeft niet te worden geroteerd.
Als we het statusbestand bekijken met behulp van het cat
hulpprogramma, zullen we opmerken dat Logrotate wat informatie heeft vastgelegd over de uitvoering:
Outputlogrotate state -- version 2
"/home/sammy/logs/access.log" 2022-07-2-19:0:0
Logrotate heeft de logs genoteerd die het heeft gezien en wanneer het ze voor het laatst heeft overwogen om te roteren. Als we dit commando één uur later uitvoeren, zal het logboek worden geroteerd zoals verwacht.
Als u wilt dat Logrotate het logbestand forceert te roteren wanneer het dat anders niet zou doen, gebruik dan de --force
vlag:
Dit is handig bij het testen van postrotate
en andere scripts.
Uiteindelijk moeten we een cron-taak instellen om Logrotate elk uur uit te voeren. Open de crontab van uw gebruiker:
Dit opent een tekstbestand. Als het de eerste keer is dat u cron gebruikt, wordt u mogelijk gevraagd om een standaard teksteditor te kiezen. Als u geen voorkeur heeft, raden we nano
aan voor nieuwe gebruikers. Er kunnen al enkele opmerkingen in het bestand staan die de cron-syntaxis uitleggen. Verplaats de cursor naar beneden naar een nieuwe lege regel aan het einde van het bestand en voeg het volgende toe:
crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
Deze taak wordt uitgevoerd op de 14e minuut van elk uur, elke dag. Het voert bijna hetzelfde logrotate
commando uit als we eerder hebben uitgevoerd, hoewel we logrotate
hebben uitgebreid tot zijn volledige pad van /usr/sbin/logrotate
om veilig te zijn. Het is een goede praktijk om volledige paden te gebruiken bij het schrijven van cron-taken. Om meer te weten te komen over cron, kunt u onze andere handleidingen bekijken.
Sla het bestand op en sluit af. Hiermee wordt de crontab geïnstalleerd en wordt onze taak uitgevoerd volgens het opgegeven schema.
Als we onze logboekmap over ongeveer een uur opnieuw bekijken, zouden we het geroteerde en gecomprimeerde logboekbestand access.log.1.gz
moeten vinden (of .2.gz
als je Logrotate hebt uitgevoerd met de --force
vlag).
Conclusie
In deze tutorial hebben we onze Logrotate-versie geverifieerd, de standaard Ubuntu Logrotate-configuratie verkend en twee verschillende soorten aangepaste configuraties ingesteld. Om meer te weten te komen over de opdrachtregel- en configuratieopties die beschikbaar zijn voor Logrotate, kunt u de handmatige pagina ervan lezen door man logrotate
uit te voeren in uw terminal of door de online documentatie te bezoeken.