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:)
Cześć. Dziś luźny artykuł, bo dziś pobawimy się jedną z pierwszy wersji Pythona. Skompilujemy go i zobaczymy co tam w… Read More
Nowy rok czas zacząć! Więc lećmy z podsumowaniem. Nowy artykuł Nie uwierzycie, ale pojawił się na blogu nowy artykuł! Piszę… Read More
Cześć! W Pythonie 3.13 dodano JITa! JIT, czyli just-in-time compiler to optymalizacja na która Python naprawdę długo czekał. Na nasze… Read More
Cześć! Zapraszam na podsumowanie roku 2024. Książki W sumie rok 2024 był pod względem ilości książek nieco podobny do roku… Read More
Podtrzymując tradycję, prawie regularnych podsumowań, zapraszam na wpis! Nie mogło obyć się bez Karkonoszy We wrześniu odwiedziłem z kolegą Karkonosze,… Read More
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Pokaż komentarze
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!:)