.mrt memo

tail -f /dev/mind > blog

Logide roteerimine Logrotatega

leave a comment »

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”. Logrotatel on konfamiseks mõned oma direktiivid, kuid üldiselt on asi suht lihtne. Kuna mul oli siin selle asjaga vaja tegeleda, siis panin mõne mõtte kirja kah apache2 näitel SLES10 peal.

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/spetsfail {
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.

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.

Written by dotmrt

2008/10/16 at 00:22:37

Posted in linux

Tagged with , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: