Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Linux Programowanie Programowanie webowe Utrzymanie oprogramowania

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:)

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

4 komentarzy
Inline Feedbacks
View all comments
Konrad

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 :)

alinek

Dzięki, bardzo fajny artykuł