Logrotate

Allikas: Kuutõrvaja

Sissejuhatus

Alati võib ise skripte kribada, kuid kui sul on puur juba olemas, siis pole augu tegemiseks enam ise näpuga surkida vaja. Lihtsalt õpi puuri kasutama.

Logrotate võiks igas kaasaegsemas pingviinis olemas olla. Leidsin netist vihje, et Suse 7.1-s veel polnud. Aga see vihje näib pärinevat eelmisest sajandist, mistõttu ka sõna “kaasaegne”. Järgnev on apache2 logide roteerimine SLES10 näitel.

Konfamine

/etc/crontab sisaldab viidet skriptile /usr/lib/cron/run-crons, mida kontrollitakse iga 15 minuti tagant:

   -*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1

Suses sõltub logrotate käima mineku aeg /etc/sysconfig/cron all defineeritud parameetrist DAILY_TIME=”4:15″. See sätestab, millal /etc/cron.daily/ sees defineeritud cronjobid käima lähevad, nende hulgas ka /etc/cron.daily/logrotate. Konf asub /etc/logrotate.conf, milles on direktiiv include /etc/logrotate.d. Selles kataloogis on iga teenuse, mille logi peaks roteerima, kohta eraldi konfifail. Ntx /etc/logrotate.d/apache2:

    /var/log/apache2/*log /var/log/apache2/spetslogifail {
    compress
    dateext
    maxage 365
    rotate 99
    size=+1024k
    notifempty
    missingok
    create 644 root root
    postrotate
    /etc/init.d/apache2 reload
    endscript
    lastaction
    scp /var/log/apache2/*.bz2 arhiiv@arhiiviserver:~/logs/
    rm /var/log/apache2/*.bz2
    endscript
    }

Suse oli automaatselt koostanud apache2 jaoks pika logiroteerimise skripti, milles oli iga faili jaoks oma loogeliste sulgudega konfi sektsioon, kuid ma tõstsin nad kõik ühte sektsiooni. Nagu eelnenud näitest näha, võib enne loogeliste sulgude algust defineerida kõik failid eraldi või kirjutada *log moodi mustri sinna. Kusjuures failinimede või mustrite eraldajaks on tühik. Edasi järgnevad mõned (rohkem või vähem) iseenesest mõistetavad direktiivid nagu:

  • compress - paki kokku logi pärast roteerimist ja postrotatet
  • dateext - pane logifailile lõppu kuupäev (vaikimisi -YYYYMMDD)
  • maxage päevi - kustutatakse päevi vanemad logid, kui maillast või mail on konfatud, siis oskab neid kustutatavaid logisid ka ennem postiga saata
  • rotate kordi - faili roteeritakse kordi enne kui ta kustutatakse või mailitakse kuhugile. 0 korda tähendab logi faili kustutamist ja tühjana uuesti loomist
  • size [+]suurus[|k|M] - logifaili roteeritakse, kui ta on suurem kui suurus. “k” on kilobaiti ja "M" megabaiti, ilma on lihtsalt baitides.
  • noifempty - ära tee midagi, kui logifail on tühi
  • missingok - ära erutu, kui logifaili polegi
  • create õigused kasutaja grupp - loo logifailid vastavates õigustes
  • postrotate/endscirpt - siia vahele võid kirjutada tegevuse, mida pärast iga faili roteerimist teha. Antud juhul siis graceful restart Apachele.
  • lastaction/encscrpit - see skript käivitatakse pärast kõikide failide roteerimist, ümber nimetamist ja pakkimist. Siia olen pannud failide kopeerimise arhiiviserverisse ning enda järelt ka puhastamise

Veel üks mõistlik asi imho on logide pakkimine bzip2-ga, mis on tunduvalt efektiivsema algoritmiga, kui default gzip. Selleks tuleb mudida /etc/logrotate.conf failis kahte rida:

    compresscmd /usr/bin/bzip2
    uncompresscmd /usr/bin/bunzip2

Tee võib teistes kohtades erineda (Debian/Ubuntu /bin/bzip2), kuid sisu jääb samaks.

Debugimine

Nüüd kui mingi esialgne näide on valmis, võib konfi debugida -d võtmega, mis logifaile ei puudu, kuid kirjutab kõik tegevused lahti. Kuna me tahame debugida ainult ühte konfi, siis on kasulik /etc/logrotate.conf-is includeda ainult see üks apache2 konfifail, mitte kogu kataloom. Selleks väike muudatus:

    #include /etc/logrotate.d
    include /etc/logrotate.d/apache2

Ja nüüd debugima:

    # logrotate -d /etc/logrotate.conf
    reading config file /etc/logrotate.conf
    compress_prog is now /usr/bin/bzip2
    compress_ext was changed to .bz2
    uncompress_prog is now /usr/bin/bunzip2
    including /etc/logrotate.d/apache2
    reading config file /etc/logrotate.d/apache2
    reading config info for /var/log/apache2/*log

    Handling 1 logs

    rotating pattern: /var/log/apache2/*log 1048576 bytes (99 rotations)
    empty log files are not rotated, old logs are removed
    considering log /var/log/apache2/access_log
    log does not need rotating
    considering log /var/log/apache2/error_log
    log does not need rotating
    considering log /var/log/apache2/ssl_request_log
    log needs rotating
    running postrotate script
    running script with arg /var/log/apache2/*log : “
    /etc/init.d/apache2 reload
    “
    running postrotate script
    running script with arg /var/log/apache2/*log : “
    /etc/init.d/apache2 reload
    “
    rotating log /var/log/apache2/ssl_request_log, log->rotateCount is 99
    glob finding old rotated logs failed
    renaming /var/log/apache2/ssl_request_log to /var/log/apache2/ssl_request_log-20081008
    creating new log mode = 0644 uid = 0 gid = 0
    running postrotate script
    running script with arg /var/log/apache2/*log : “
    /etc/init.d/apache2 reload
    “
    compressing log with: /usr/bin/bzip2
    running last action script
    running script with arg /var/log/apache2/*log : “
    scp /var/log/apache2/*.bz2 arhiiv@arhiiviservu:~/logs/
    rm /var/log/apache2/*.bz2
    “

Apache-t võib niimoodi reloadida, kuna see on lühiajaline tegevus, kuid niimoodi mitu korda teha pole tegelikult ju eriti ilus. Võibolla saaks ka kuidagi paremini.

Mitmete kaustade roteerimine

Võimalik märkida seda tärniga

/usr/local/apache2/logs/*log /home/*/logs/*log {

Käivitus

Ja lõpuks käima saab asja lasta (ilma cronjobi käivitamist ära ootamata)

logrotate -v /etc/logrotate.conf

-v on jutukas väljund, mis võimaldab kohe näha, mis tegelikult tehti.

FreeBSD kasutamise märkused

paigaldada saab portsust /usr/ports/sysutils/logrotate

Käivitamiseks crontabi täisrajaga selliselt, et logisid roteeritaks kell 1 öösel

# logrotate
0	1	*	*	*	root	/usr/local/sbin/logrotate /usr/local/etc/logrotate.conf > /dev/null 2>&1

Webalizeri kasutamise märkused

Webalizeri skript tuleks lisada logrotate algusse prerotate - endscript tagide vahele.

Lingid

http://www.linux.com/archive/feature/48390

https://wiki.itcollege.ee/index.php/Logrotate