Hvordan sette opp og administrere loggrotasjon ved å bruke Logrotate i Linux


En av de mest interessante (og kanskje en av de viktigste også) katalogene i et Linux-system er /var/log. I følge Filesystem Hierarchy Standard skrives aktiviteten til de fleste tjenester som kjører i systemet til en fil i denne katalogen eller en av dens underkataloger.

Slike filer er kjent som logger og er nøkkelen til å undersøke hvordan systemet fungerer (og hvordan det har oppført seg tidligere). Logger er også den første informasjonskilden der administratorer og ingeniører ser under feilsøking.

Hvis vi ser på innholdet i /var/log på en CentOS/RHEL/Fedora og Debian/Ubuntu (for variasjon) vil vi se følgende loggfiler og underkataloger.

Vær oppmerksom på at resultatet kan være noe annerledes i ditt tilfelle avhengig av tjenestene som kjører på systemet(e) og tiden de har kjørt.

# ls /var/log
# ls /var/log

I begge tilfeller kan vi observere at noen av loggnavnene ender som forventet i \log, mens andre enten blir omdøpt med en dato (for eksempel maillog-20160822 på CentOS) eller komprimert (vurder auth.log.2. gz og mysql.log.1.gz på Debian).

Dette er ikke en standard oppførsel basert på den valgte distribusjonen, men kan endres etter ønske ved å bruke direktiver i konfigurasjonsfilene, som vi vil se i denne artikkelen.

Hvis logger ble holdt for alltid, ville de til slutt ende opp med å fylle filsystemet der /var/log ligger. For å forhindre det, kan systemadministratoren bruke et fint verktøy kalt logrotate for å rydde opp i loggene med jevne mellomrom.

Med noen få ord vil logrotate gi nytt navn til eller komprimere hovedloggen når en betingelse er oppfylt (mer om det om et minutt) slik at neste hendelse registreres på en tom fil.

I tillegg vil den fjerne «gamle» loggfiler og beholde de nyeste. Selvfølgelig får vi bestemme hva «gammel» betyr og hvor ofte vi vil at logrotate skal rydde opp i loggene for oss.

Installerer Logrotate i Linux

For å installere logrotate, bruk bare pakkebehandlingen din:

---------- On Debian and Ubuntu ---------- 
# aptitude update && aptitude install logrotate 

---------- On CentOS, RHEL and Fedora ---------- 
# yum update && yum install logrotate

Det er verdt å merke seg at konfigurasjonsfilen (/etc/logrotate.conf) kan indikere at andre, mer spesifikke innstillinger kan plasseres på individuelle .conf-filer inne i /etc/logrotate.d.

Dette vil være tilfelle hvis og bare hvis følgende linje eksisterer og ikke er kommentert ut:

include /etc/logrotate.d

Vi vil holde oss til denne tilnærmingen, siden den vil hjelpe oss å holde orden på ting, og bruke Debian-boksen for følgende eksempler.

Konfigurer Logrotate i Linux

Som et veldig allsidig verktøy, gir logrotate massevis av direktiver for å hjelpe oss med å konfigurere når og hvordan loggene skal roteres, og hva som skal skje rett etterpå.

La oss sette inn følgende innhold i /etc/logrotate.d/apache2.conf (merk at du mest sannsynlig må lage den filen) og undersøke hver linje for å indikere formålet:

/var/log/apache2/* {
    weekly
    rotate 3
    size 10M
    compress
    delaycompress
}

Den første linjen indikerer at direktivene inne i blokken gjelder for alle logger inne i /var/log/apache2:

  • ukentlig betyr at verktøyet vil forsøke å rotere loggene på ukentlig basis. Andre mulige verdier er daglige og månedlige.
  • roter 3 indikerer at kun 3 roterte logger skal føres. Dermed vil den eldste filen bli fjernet ved den fjerde påfølgende kjøringen.
  • størrelse=10M setter minimumsstørrelsen for at rotasjonen skal finne sted til 10M. Med andre ord, hver logg vil ikke roteres før den når 10 MB.
  • compress og delaycompress brukes til å fortelle at alle roterte logger, med unntak av den nyeste, skal komprimeres.

La oss kjøre en tørrkjøring for å se hva logrotate ville gjort hvis den faktisk ble utført nå. Bruk -d-alternativet etterfulgt av konfigurasjonsfilen (du kan faktisk kjøre logrotate ved å utelate dette alternativet):

# logrotate -d /etc/logrotate.d/apache2.conf

Resultatene vises nedenfor:

I stedet for å komprimere loggene, kunne vi gi dem nytt navn etter datoen da de ble rotert. For å gjøre det bruker vi dateext-direktivet. Hvis datoformatet vårt er et annet enn standard ååååmmdd, kan vi spesifisere det ved å bruke datoformat.

Merk at vi til og med kan forhindre at rotasjonen skjer hvis loggen er tom med notifempty. I tillegg, la oss fortelle logrotate å sende den roterte loggen til systemadministratoren (e-postserveren skal settes opp, noe som er utenfor denne artikkelens omfang).

Hvis du ønsker å få e-post om logrotate, kan du sette opp Postfix mailserver som vist her: Installer Postfix Mail Server

Denne gangen vil vi bruke /etc/logrotate.d/squid.conf for kun å rotere /var/log/squid/access.log:

/var/log/squid/access.log {
    monthly
    create 0644 root root
    rotate 5
    size=1M
    dateext
    dateformat -%d%m%Y
    notifempty
    mail [email 
}

Som vi kan se på bildet nedenfor, trengte ikke denne loggen å roteres. Men når størrelsesbetingelsen er oppfylt (størrelse=1M), vil den roterte loggen bli omdøpt til access.log-25082020 (hvis loggen ble rotert 25. august 2020) og hovedloggen (access.log) vil bli om- opprettet med tilgangstillatelser satt til 0644 og med root som eier og gruppeeier.

Til slutt, når antallet logger endelig når 6, sendes den eldste loggen til [email .

La oss nå anta at du vil kjøre en egendefinert kommando når rotasjonen finner sted. For å gjøre det, plasser linjen med en slik kommando mellom postrotate- og endscript-direktivene.

La oss for eksempel anta at vi vil sende en e-post til root når noen av loggene i /var/log/myservice blir rotert. La oss legge til linjene i rødt til /etc/logrotate.d/squid.conf:

/var/log/myservice/* {
	monthly
	create 0644 root root
	rotate 5
	size=1M
    	postrotate
   		echo "A rotation just took place." | mail root
    	endscript
}

Sist, men ikke minst, er det viktig å merke seg at alternativene som finnes i /etc/logrotate.d/*.conf overstyrer de i hovedkonfigurasjonsfilen i tilfelle konflikter.

Logrotate og Cron

Som standard oppretter installasjonen av logrotate en crontab-fil inne i /etc/cron.daily med navnet logrotate. Som det er tilfellet med de andre crontab-filene i denne katalogen, vil den bli utført daglig fra kl. 06:25 hvis anacron ikke er installert.

Ellers vil henrettelsen begynne rundt 07:35. For å bekrefte, se etter linjen som inneholder cron.daily i enten /etc/crontab eller /etc/anacrontab.

Sammendrag

I et system som genererer flere logger, kan administrasjonen av slike filer forenkles betraktelig ved å bruke logrotate. Som vi har forklart i denne artikkelen, vil den automatisk rotere, komprimere, fjerne og sende logger med jevne mellomrom eller når filen når en gitt størrelse.

Bare sørg for at den er satt til å kjøre som en cron-jobb og logrotate vil gjøre ting mye enklere for deg. For mer informasjon, se man-siden.

Har du spørsmål eller forslag til denne artikkelen? Gi oss gjerne beskjed ved å bruke kommentarskjemaet nedenfor.