Automatyczne rotowanie logów

Praktycznie na każdym serwerze odkładają nam się tony logów, im więcej się dzieje w systemie tym szybciej znika nam miejsce na dysku. Spróbuję przedstawić proste i skuteczne rozwiązanie jakim jest logrotate, dzięki niemu zapomnisz o rm -rf /var/log/* ;-)

logrotate został stworzony w celu ułatwienia zarządzania plikami logów, w systemach które generują dużą liczbę plików, w prosty sposób umożliwia automatyczną obsługę, np. rotowanie, kompresję czy usuwanie. Każdy plik może być rotowany z różną częstotliwością, codziennie, tygodniowo, miesięcznie, lub na podstawie rozmiaru.

Przyjrzyjmy się przykładowej konfiguracji /etc/logrotate.conf:

/var/log/syslog {
rotate 7
daily
compress
postrotate
/usr/sbin/invoke-rc.d syslog-ng reload >/dev/null
endscript
}

Pierwsza linia /var/log/syslog wskazuje na plik który chcemy rotować, później określamy ile chcemy przechowywać plików wstecz, w tym przypadku rotate 7, zapewni nam tygodniową archiwizację plik syslog, daily oznacza, że pliki muszą być rotowane codziennie, compress wykonuje gzip na zarchiwizowanym pliku, postrotate określa akcję jaka ma zostać wykonana po zrotowaniu pliku, czyli reload dla procesu syslog-ng (zabieramy plik syslogowi, trzeba zmusić go do zmiany deskryptora), endscript kończy naszą konfigurację.

Pozostaje nam tylko zapiąć do cron'a regularne uruchamianie logrotate'a (w moim przypadku umieściłem całość w /etc/cron.daily/logrotate

#!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

Sprawdzamy czy /usr/sbin/logrotate istnieje, jeśli tak to uruchamiamy z parametrem pliku konfiguracyjnego /etc/logrotate.conf

Nasze pliki wyglądają następująco:

# ls -la /var/log/syslog*
-rw-r----- 1 root adm 66545 2011-02-06 15:26 /var/log/syslog
-rw-r----- 1 root adm 10435 2011-02-06 06:47 /var/log/syslog.1.gz
-rw-r----- 1 root adm  8194 2011-02-05 06:47 /var/log/syslog.2.gz
-rw-r----- 1 root adm  8139 2011-02-04 06:50 /var/log/syslog.3.gz
-rw-r----- 1 root adm  8351 2011-02-03 06:46 /var/log/syslog.4.gz
-rw-r----- 1 root adm  8322 2011-02-02 06:40 /var/log/syslog.5.gz
-rw-r----- 1 root adm  8383 2011-02-01 06:44 /var/log/syslog.6.gz
-rw-r----- 1 root adm  8885 2011-01-31 06:46 /var/log/syslog.7.gz

Mamy aktualny plik /var/log/syslog, a dodatkowo 7 zrotowanych i zgzipowanych plików.

Z innych ciekawych opcji polecam, size która pozwala określić maxymalny rozmiar pliku po których zostanie dokonana archiwizacja, mail dzięki której możemy otrzymywać powiadomienia o statusie, olddir która zapewnia, że pliki rotowane będą przenoszone do innego katalogu oraz, create dzięki której możemy nadać uprawnienia z jakimi będzie tworzony nowy plik loga.

Przy okazji wspomnę o bazie wiedzy w stylu serverfault.com, którą chcemy zbudować z Waszą pomocą, zachęcam do rejestracji i aktywnego udziału ;-)

  • A nie powinno być "rotatowanie"? ;)

  • Może być i "rotatowanie" ;-) o ile nigdy nie skończy nam się miejsce w /var/log/ ;-)

  • barkh

    A co z np. kopiowaniem raz na tydzien całego logu - istnieje jakas prosta metoda w logrotate, czy musze robic workaround w bashu ?

  • Zamiast "daily" powinienes dac "weekly".

  • barkh

    Ale jako dwie osobne instrukcje (potraktowanie jednego pliku 2 razy), czy jako dwie komendy w tej jednej instrukcji ?
    Potrzebuje czegoś w stylu rotate 7 daily + rotate 9999 weekly.

  • Nigdy nie używałem takiej kombinacji, musiałbym potestować, ale przyjrzyj się bliżej opcjom copy, nocopytruncate.