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:)
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
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… 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!:)