Logrotate – narzędzie do rotowania logów
Cześć,
dalej lecimy z narzędziami linuxowymi – tym razem szybki przegląd narzędzia które nazywa się logrotate.
Aplikacje które piszemy muszą dać się utrzymywać a więc muszą zapisywać przebieg swojego działania tak by móc badać co, kiedy i dlaczego źle się wykonało, tym samym sprawiając że naszą aplikacja staje się lepsza.
Tym co przechowuje zapis poczynań aplikacji są logi. Logi to pliki które są zapisywane przez nasze programy. W teorii możemy tam zapisywać wszystko co chcemy, w praktyce warto mieć te logi w jakiś sposób spójne i jednolite – tak czy siak – o samych logach przeczytasz w moim innym wpisie, znacznie obszerniejszym, bo traktującym o całym utrzymaniu systemów.
Zakładam więc że wiesz czym są te logi:)
Aplikacje, demony, serwisy i tak dalej – wszystkie te programy działają ciągle w czasie, generując olbrzymią ilość logów. Aby móc je analizować wygodnie, warto takie logi rotować. Rotować logi znaczy dzielić je wg jakiegoś kryterium, np:
– jeśli plik logów osiągnie np. 2MB to przenieś ten plik w określone miejsce, ewentualnie wykonaj jakiś akcję dodatkową (pozwoli to na łatwiejsze czytanie logów, bo nigdy nie będziemy czytać plików większych niż 2MB)
– zostaw w folderze ostatnie N plików z logami np. ostatnie 7 plików, rotowanych codziennie (dostajemy 7 plików, każdy na jeden dzień, starsze są przenoszone do innych folderów)
itp..
No dobra, załóżmy że nasze logi wyglądają tak:
1 2 3 4 5 6 7 8 | 2018-03-10 19:10:21 32432fffdsf42 Waiting for data 2018-03-10 19:10:21 78926567dsfsd Waiting for data 2018-03-10 19:10:22 32432fffdsf42 Data received 2018-03-10 19:10:25 78926567dsfsd Data received 2018-03-10 19:10:26 78926567dsfsd Collected data: {'id': 12345} 2018-03-10 19:10:27 32432fffdsf42 Collected data: {'id': 92225} 2018-03-10 19:10:27 78926567dsfsd Error validaton! 2018-03-10 19:10:27 32432fffdsf42 Processing data for input... (args 12332) |
I w systemie plików wygląda to tak:
1 2 | total 4.0K -rw-r--r--. 1 mmazurek mmazurek 453 Nov 30 23:04 app.log |
Otwórzmy teraz plik konfiguracyjny logrotate’a czyli /etc/logrotate.conf i dodajmy na końcu:
1 2 3 4 5 | /home/mmazurek/logs/app.log { rotate 7 daily compress } |
i zapiszmy. Definicję logrotate’a do własnych aplikacji to modelowo wrzucamy do folderu /etc/logrotate.d/ – tutaj dodajemy do głównego pliku konf tylko po to żeby było wygodniej nam tu pobawić się tym:)
I teraz jeśli wykonamy:
1 | sudo logrotate /etc/logrotate.conf |
To w naszym folderze pojawi się:
1 2 3 | razem 4,0K -rw-r--r--. 1 mmazurek mmazurek 0 11-30 23:22 app.log -rw-r--r--. 1 mmazurek mmazurek 210 11-30 23:18 app.log-20181130.gz |
Czyli logrotate dokonał archiwizacji danych z aktualnego dnia i utworzył nowy plik logów. Ponieważ w definicji mamy „daily” to logi są rotowane „dziennie”, stąd data w nazwie pliku. Flaga compress odpowiada za to że plik jest skompresowany a „rotate 7” mówi że takich plików logrotate utworzy max 7.
I zgodnie z logiką, jeśli nasza definicja przyjmie postać
1 2 3 4 5 | /home/mmazurek/logs/app.log { rotate 7 hourly compress } |
To plik stworzony przez logrotate’a będzie wyglądał tak:
1 2 3 | razem 4,0K -rw-r--r--. 1 mmazurek mmazurek 0 11-30 23:32 app.log -rw-r--r--. 1 mmazurek mmazurek 20 11-30 23:22 app.log-2018113023.gz |
czyli nazwa pliku jest z godziną.
Możemy do naszej definicji dodać wygodne flagi:
1 2 | missingok - sprawia że nic złego się nie dzieje jeśli logrotate nie znajdzie pliku do zrotowania notifempty - logrotate nie będzie rotował plików pustych |
Poza tym ciekawostką są bloki które mogą zostać wykonane przed lub po rotowaniu. W definicji naszej możemy dodać coś takiego:
1 2 3 | postrotate supervisorctl restart app endscript |
Co spowoduje zrestartowanie aplikacji utrzymywanej przez supervisor’a PO zrotowaniu logów. Analogiczna funkcjonalność, tylko wykonywania przed zrotowaniem, jest dostępna dla pary flag prerotate/endscript.
Jeśli bawisz się rotowaniem i testujesz swoją definicje to polecam przełączniki
–force – wymusza rotowanie nawet jeśli go nie potrzeba (np. dla tej godziny pliki już zostały zrotowane)
–verbose – pokazuje co logrotate robi pod spodem
No i kończąc – potrzebny jest wpis do cron’a żeby to mogło działać, czyli np:
1 | 10 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf |
Co spowoduje odpalanie rotowania w każdej 10tej minucie każdej godziny i każdego dnia, jest to bezpieczne bo po prostu jeśli rotowanie się już zrobiło, to nie zrobi się drugi raz bez „–force”.
No i w sumie to tyle – oczywiście to narzędzie ma znacznie większe możliwości niż to co napisałem tu, ale nie widzę potrzeby kopiowania dokumentacji:) Więc jeśli Cię temat zainteresował – to łap za dokumentację i twórz:)
Mateusz Mazurek
Wspominasz o możliwości przeniesienia starszych logów np. do innego katalogu. Szkoda, że w artykule zabrakło przykładu konfiguracji uwzględniającej takie działanie gdyż właśnie czegoś takiego szukałem :)
Dzięki! Może zrobię followup:)
Dzięki, bardzo fajny artykuł
Dzięki!:)