Jednym z najciekawszych (i być może jednym z najważniejszych) katalogów w systemie Linux jest /var/log
. Zgodnie ze standardem Hierarchii Systemu Plików, aktywność większości usług działających w systemie jest zapisywana do pliku wewnątrz tego katalogu lub jednego z jego podkatalogów.
Pliki takie znane są jako logi i są kluczem do zbadania, jak działa system (i jak zachowywał się w przeszłości). Logi są również pierwszym źródłem informacji, do którego zaglądają administratorzy i inżynierowie podczas rozwiązywania problemów.
Jeśli przyjrzymy się zawartości /var/log
na systemach CentOS/RHEL/Fedora i Debian/Ubuntu (dla odmiany) zobaczymy następujące pliki logów i podkatalogi.
Pamiętaj, że wynik może być nieco inny w twoim przypadku w zależności od usług uruchomionych w twoim systemie(ach) i czasu w jakim były uruchomione.
W systemach RHEL/CentOS i Fedora
# ls /var/log
W systemach Debian i Ubuntu
W systemie UbuntuW systemie CentOS 7Debian i Ubuntu
# ls /var/log
W obu przypadkach, możemy zaobserwować, że niektóre nazwy logów kończą się zgodnie z oczekiwaniami na „log”, podczas gdy inne są albo przemianowane przy użyciu daty (na przykład maillog-20160822 w CentOS), albo skompresowane (rozważ auth.log.2.gz i mysql.log.1.gz w Debianie).
Nie jest to domyślne zachowanie zależne od wybranej dystrybucji, ale może być dowolnie zmieniane za pomocą dyrektyw w plikach konfiguracyjnych, jak zobaczymy w tym artykule.
Gdyby logi były przechowywane wiecznie, w końcu zapełniłyby system plików, w którym rezyduje /var/log. Aby temu zapobiec, administrator systemu może użyć narzędzia o nazwie logrotate do okresowego czyszczenia logów.
W kilku słowach, logrotate zmieni nazwę lub skompresuje główny log, gdy spełniony zostanie pewien warunek (więcej o tym za chwilę), tak aby następne zdarzenie zostało zarejestrowane w pustym pliku.
Dodatkowo usunie „stare” pliki logów i zachowa najnowsze. Oczywiście to my decydujemy, co oznacza „stare” i jak często chcemy, aby logrotate czyścił za nas logi.
Instalacja Logrotate w Linuksie
Aby zainstalować logrotate, wystarczy użyć menedżera pakietów:
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
Warto i dobrze jest zauważyć, że plik konfiguracyjny (/etc/logrotate.conf
) może wskazywać, że inne, bardziej specyficzne ustawienia mogą być umieszczone na poszczególnych .conf
plikach wewnątrz /etc/logrotate.d.
Tak będzie wtedy i tylko wtedy, gdy poniższy wiersz istnieje i nie jest wykomentowany:
include /etc/logrotate.d
Pozostaniemy przy tym podejściu, ponieważ pomoże nam to utrzymać porządek, i użyjemy pudełka Debiana do poniższych przykładów.
Konfiguracja Logrotate w Linuksie
Będąc bardzo wszechstronnym narzędziem, logrotate dostarcza wiele dyrektyw, które pomogą nam skonfigurować kiedy i jak logi będą rotowane, oraz co powinno się stać zaraz po tym.
Wstawmy następującą zawartość do /etc/logrotate.d/apache2.conf (zauważ, że najprawdopodobniej będziesz musiał stworzyć ten plik) i przeanalizujmy każdą linię, aby wskazać jej przeznaczenie:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress}
Pierwsza linia wskazuje, że dyrektywy wewnątrz bloku odnoszą się do wszystkich logów w /var/log/apache2:
- tygodniowy oznacza, że narzędzie będzie próbowało rotować logi co tydzień. Inne możliwe wartości to daily i monthly.
- rotate 3 oznacza, że tylko 3 rotowane logi powinny być przechowywane. W ten sposób najstarszy plik zostanie usunięty przy czwartym kolejnym uruchomieniu.
- size=10M ustawia minimalny rozmiar dziennika, który ma być poddany rotacji na 10M. Innymi słowy, każdy log nie będzie rotowany, dopóki nie osiągnie rozmiaru 10MB.
- compress i delaycompress są używane, aby powiedzieć, że wszystkie rotowane logi, z wyjątkiem najnowszego, powinny być skompresowane.
Wykonajmy dry-run, aby zobaczyć, co zrobiłby logrotate, gdyby został wykonany teraz. Użyj opcji -d
a następnie pliku konfiguracyjnego (możesz uruchomić logrotate pomijając tę opcję):
# logrotate -d /etc/logrotate.d/apache2.conf
Wyniki są pokazane poniżej:
Zamiast kompresować logi, moglibyśmy zmienić ich nazwę po dacie, kiedy zostały obrócone. W tym celu użyjemy dyrektywy dateext
. Jeśli nasz format daty jest inny niż domyślny yyyymmdd, możemy go określić za pomocą dateformat.
Zauważmy, że możemy nawet zapobiec rotacji, jeśli log jest pusty za pomocą notifempty. Dodatkowo powiedzmy logrotate, aby wysłał pocztą obrócony dziennik do administratora systemu ([email protected] w tym przypadku) dla jego / jej odniesienia (będzie to wymagało skonfigurowania serwera pocztowego, co jest poza zakresem tego artykułu).
Jeśli chcesz otrzymywać e-maile o logrotate, możesz skonfigurować serwer pocztowy Postfix, jak pokazano tutaj: Install Postfix Mail Server
Tym razem użyjemy /etc/logrotate.d/squid.conf, aby rotować tylko /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 protected]}
Jak widzimy na poniższym obrazku, ten log nie musiał być rotowany. Jednakże, gdy zostanie spełniony warunek rozmiaru (size=1M), obrócony dziennik zostanie przemianowany na access.log-25082020 (jeśli dziennik został obrócony 25 sierpnia 2020), a główny dziennik (access.log) zostanie ponownie utworzony z uprawnieniami dostępu ustawionymi na 0644 i z rootem jako właścicielem i właścicielem grupy.
Na koniec, gdy liczba logów osiągnie 6, najstarszy log zostanie wysłany na adres [email protected].
Załóżmy teraz, że chcesz uruchomić niestandardową komendę, gdy nastąpi rotacja. Aby to zrobić, umieść linię z takim poleceniem pomiędzy dyrektywami postrotate i endscript.
Na przykład, załóżmy, że chcemy wysłać wiadomość e-mail do root’a, gdy któryś z logów w /var/log/myservice zostanie obrócony. Dodajmy linie zaznaczone na czerwono do /etc/logrotate.d/squid.conf:
/var/log/myservice/* {monthlycreate 0644 root rootrotate 5size=1M postrotate echo "A rotation just took place." | mail root endscript}
Na koniec warto zauważyć, że opcje obecne w /etc/logrotate.d/*.conf
zastępują te z głównego pliku konfiguracyjnego w przypadku konfliktu.
Logrotate i Cron
Domyślnie, instalacja logrotate tworzy plik crontab wewnątrz /etc/cron.daily o nazwie logrotate. Podobnie jak w przypadku innych plików crontab w tym katalogu, będzie on wykonywany codziennie od godziny 6:25, jeśli nie jest zainstalowany anacron.
W przeciwnym razie, wykonywanie rozpocznie się około godziny 7:35. Aby to sprawdzić, poszukaj linii zawierającej cron.daily w pliku /etc/crontab lub /etc/anacrontab.
Podsumowanie
W systemie, który generuje kilka logów, administracja takimi plikami może być znacznie uproszczona dzięki logrotate. Jak wyjaśniliśmy w tym artykule, będzie on automatycznie rotował, kompresował, usuwał i wysyłał logi okresowo lub gdy plik osiągnie określony rozmiar.
Pewnie upewnij się, że jest ustawiony do uruchamiania jako zadanie cron, a logrotate znacznie ułatwi Ci pracę. Więcej szczegółów można znaleźć na stronie man.