📋 Jak używać logrotate do rotacji i archiwizacji logów systemowych w systemie Linux
Pliki logów są kluczowym elementem każdego systemu, dostarczając bezcennych informacji o jego działaniu, błędach i potencjalnych zagrożeniach. Jednak bez odpowiedniego zarządzania, logi mogą szybko rozrosnąć się do gigantycznych rozmiarów, zajmując przestrzeń dyskową i utrudniając analizę. W tym kompleksowym przewodniku poznasz logrotate - potężne narzędzie w systemach Linux, które automatyzuje rotację, kompresję i archiwizację plików logów, zapewniając ich efektywne zarządzanie.
⚡ Ekspresowe Podsumowanie:
- Zrozumienie logrotate - poznaj podstawowe zasady działania i lokalizację plików konfiguracyjnych narzędzia.
- Konfiguracja rotacji - naucz się ustawiać częstotliwość rotacji, kompresję i retencję logów.
- Zaawansowane opcje - wykorzystaj skrypty prerotate/postrotate, warunki i niestandardowe wzorce.
- Przykłady praktyczne - gotowe konfiguracje dla popularnych usług i aplikacji.
🗺️ Spis Treści - Twoja Mapa Drogowa
📋 Wprowadzenie do logrotate
Czym jest logrotate i dlaczego jest niezbędny?
Logrotate to standardowe narzędzie w systemach Linux, zaprojektowane do automatycznego zarządzania plikami logów. Jego główne zadania to:
- Rotacja logów - zamykanie bieżących plików logów i tworzenie nowych
- Kompresja - zmniejszanie rozmiaru starszych plików logów
- Archiwizacja - przechowywanie logów przez określony czas
- Usuwanie - pozbywanie się najstarszych plików logów według zdefiniowanych reguł
Bez odpowiedniego zarządzania, pliki logów mogą:
- Zajmować nadmierną ilość przestrzeni dyskowej
- Spowalniać system podczas operacji na dużych plikach
- Utrudniać analizę i wyszukiwanie informacji
- W skrajnych przypadkach doprowadzić do zapełnienia dysku i awarii systemu
Jak działa logrotate?
Logrotate działa na podstawie zdefiniowanych reguł, wykonując następujące kroki:
- Sprawdzenie czy plik logu spełnia warunki rotacji (rozmiar, czas, itp.)
- Jeśli warunki są spełnione:
- Zamknięcie bieżącego pliku logu
- Zmiana nazwy pliku zgodnie z konfiguracją (np. dodanie daty)
- Utworzenie nowego, pustego pliku logu
- Opcjonalna kompresja starszego pliku
- Usunięcie najstarszych plików według zdefiniowanych zasad retencji
- Wykonanie zdefiniowanych skryptów przed i po rotacji
Domyślnie, logrotate jest uruchamiany codziennie przez zadanie cron:
/etc/cron.daily/logrotate
Lokalizacja plików konfiguracyjnych
Logrotate korzysta z następujących plików konfiguracyjnych:
- /etc/logrotate.conf - główny plik konfiguracyjny, zawierający globalne ustawienia
- /etc/logrotate.d/ - katalog zawierający dodatkowe pliki konfiguracyjne, zwykle jeden plik na aplikację lub usługę
Struktura ta pozwala na:
- Centralne zarządzanie globalnymi ustawieniami
- Modularną konfigurację specyficzną dla konkretnych usług
- Łatwą instalację i odinstalowanie konfiguracji wraz z pakietami
✨ Pro Tip: Aby sprawdzić, jak zachowa się logrotate bez faktycznego wykonywania rotacji, użyj opcji -d
(debug):
sudo logrotate -d /etc/logrotate.conf
🔧 Podstawowa konfiguracja logrotate
Instalacja logrotate (jeśli nie jest zainstalowany)
W większości dystrybucji Linux, logrotate jest instalowany domyślnie. Jeśli jednak go brakuje, można go łatwo zainstalować:
Dla systemów opartych na Debian/Ubuntu:
sudo apt update
sudo apt install logrotate
Dla systemów opartych na RHEL/CentOS/Fedora:
sudo yum install logrotate
# lub
sudo dnf install logrotate
Struktura pliku konfiguracyjnego
Każdy plik konfiguracyjny logrotate składa się z globalnych dyrektyw i bloków konfiguracyjnych dla konkretnych plików logów:
# Globalne dyrektywy (opcjonalne)
weekly
rotate 4
create
compress
include /etc/logrotate.d
# Blok konfiguracyjny dla konkretnego pliku lub wzorca
/var/log/przykład.log {
# Dyrektywy specyficzne dla tego pliku
monthly
rotate 12
compress
missingok
}
Dyrektywy specyficzne dla pliku nadpisują globalne ustawienia.
Najważniejsze opcje konfiguracyjne
Podstawowe dyrektywy czasowe
Dyrektywa | Opis |
---|---|
daily |
Rotacja wykonywana codziennie |
weekly |
Rotacja wykonywana raz w tygodniu |
monthly |
Rotacja wykonywana raz w miesiącu |
yearly |
Rotacja wykonywana raz w roku |
Dyrektywy retencji i rozmiaru
Dyrektywa | Opis |
---|---|
rotate n |
Zachowanie n zrotowanych plików przed usunięciem |
size size |
Rotacja, gdy plik przekroczy określony rozmiar (np. 100M, 1G) |
maxsize size |
Maksymalny rozmiar pliku przed rotacją |
minsize size |
Minimalny rozmiar pliku przed rotacją |
Dyrektywy kompresji
Dyrektywa | Opis |
---|---|
compress |
Kompresja zrotowanych plików |
nocompress |
Brak kompresji zrotowanych plików |
compresscmd |
Polecenie używane do kompresji (domyślnie gzip) |
compressext |
Rozszerzenie dla skompresowanych plików |
delaycompress |
Opóźnienie kompresji do następnego cyklu rotacji |
Dyrektywy obsługi plików
Dyrektywa | Opis |
---|---|
create mode owner group |
Tworzenie nowego pustego pliku z określonymi uprawnieniami |
nocreate |
Brak tworzenia nowego pliku po rotacji |
copytruncate |
Kopiowanie zawartości i wyczyszczenie oryginalnego pliku |
notifempty |
Pominięcie rotacji pustych plików |
missingok |
Brak błędu, jeśli plik nie istnieje |
nomissingok |
Zgłoszenie błędu, jeśli plik nie istnieje |
Przykład podstawowej konfiguracji
Oto przykład prostej konfiguracji logrotate dla pliku logu aplikacji:
/var/log/aplikacja.log {
# Rotacja tygodniowa
weekly
# Zachowanie 5 ostatnich zrotowanych plików
rotate 5
# Kompresja zrotowanych plików
compress
# Opóźnienie kompresji o jeden cykl
delaycompress
# Ignorowanie braku pliku
missingok
# Pominięcie rotacji, jeśli plik jest pusty
notifempty
# Tworzenie nowego pliku z określonymi uprawnieniami
create 0640 www-data adm
}
✨ Pro Tip: Jeśli chcesz zastosować podobne ustawienia do wielu plików, możesz użyć wzorców globbing:
/var/log/aplikacja/*.log {
weekly
rotate 5
compress
missingok
}
🛠️ Zaawansowana konfiguracja logrotate
Skrypty prerotate i postrotate
Jedną z najpotężniejszych funkcji logrotate są skrypty wykonywane przed i po rotacji:
/var/log/nginx/*.log {
daily
rotate 7
compress
# Skrypt wykonywany przed rotacją
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
# Skrypt wykonywany po rotacji
postrotate
systemctl reload nginx
endscript
}
Typowe zastosowania skryptów:
- Przeładowanie usługi, aby zaczęła zapisywać do nowego pliku logu
- Wysyłanie powiadomień o rotacji
- Kopiowanie logów do zewnętrznego systemu archiwizacji
- Wykonywanie analiz lub przetwarzania zamkniętych plików
Warunki i wyrażenia logiczne
Logrotate pozwala na użycie warunków do określenia, czy rotacja powinna być wykonana:
/var/log/aplikacja.log {
# Rotacja, gdy plik przekroczy 100MB lub co tydzień (co nastąpi pierwsze)
size 100M
weekly
# Rotacja tylko jeśli plik jest większy niż 1KB
minsize 1k
# Maksymalny rozmiar przed wymuszeniem rotacji
maxsize 200M
rotate 5
compress
}
Datestamp i niestandardowe nazewnictwo
Domyślnie, logrotate dodaje przyrostek numeryczny do zrotowanych plików (np. log.1
, log.2.gz
). Można to zmienić, używając opcji dateext
:
/var/log/aplikacja.log {
daily
rotate 30
compress
# Dodanie daty zamiast licznika
dateext
# Format daty: YYYYMMDD
dateformat -%Y%m%d
# Opcjonalnie: własny format
# dateformat -%Y-%m-%d-%H%M%S
}
Rezultatem będą pliki jak aplikacja.log-20250429.gz
.
Konfiguracja dla wielu hostów
Przy zarządzaniu wieloma serwerami, warto standaryzować konfigurację logrotate:
/var/log/remote/%hostname%/*.log {
daily
rotate 14
compress
missingok
dateext
dateformat -%Y%m%d-%H%M%S
maxage 90
}
Zmienna %hostname%
zostanie zastąpiona nazwą hosta, co pozwala na organizację logów według serwerów.
Obsługa aplikacji niekompatybilnych z standardową rotacją
Niektóre aplikacje nie radzą sobie dobrze ze standardową rotacją plików. W takich przypadkach można użyć opcji copytruncate
:
/var/log/problematyczna-aplikacja.log {
daily
rotate 7
compress
missingok
# Kopiowanie pliku i czyszczenie oryginału zamiast przenoszenia
copytruncate
}
Uwaga: Przy użyciu copytruncate
istnieje niewielkie ryzyko utraty danych zapisywanych dokładnie w momencie rotacji. Jest to kompromis dla aplikacji, które nie mogą być przeładowane.
📊 Przykłady konfiguracji dla popularnych usług
Apache HTTP Server
/var/log/apache2/*.log {
daily
rotate 14
compress
delaycompress
notifempty
create 640 www-data adm
sharedscripts
postrotate
if systemctl status apache2 >/dev/null 2>&1; then \
systemctl reload apache2; \
fi
endscript
}
Nginx
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi
endscript
postrotate
systemctl reload nginx
endscript
}
MySQL/MariaDB
/var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/error.log {
daily
rotate 7
missingok
create 640 mysql adm
compress
sharedscripts
postrotate
systemctl reload mysql
endscript
}
System syslog (rsyslog)
/var/log/syslog {
daily
rotate 7
compress
delaycompress
postrotate
systemctl restart rsyslog
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages {
weekly
rotate 4
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
systemctl restart rsyslog
endscript
}
Dzienniki jądra (dmesg)
/var/log/dmesg {
monthly
create 640 root adm
rotate 4
compress
delaycompress
notifempty
missingok
}
Logi aplikacji kontenera Docker
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
size 50M
missingok
delaycompress
copytruncate
}
✨ Pro Tip: Dla Dockera lepszym rozwiązaniem może być skonfigurowanie sterownika logowania Docker (np. json-file z opcjami rotacji lub przekazywanie logów do zewnętrznego systemu jak syslog).
🔍 Testowanie i rozwiązywanie problemów
Testowanie konfiguracji bez wykonywania rotacji
Przed wdrożeniem zmian w konfiguracji, warto przetestować, jak będzie zachowywać się logrotate:
# Test globalnej konfiguracji
sudo logrotate -d /etc/logrotate.conf
# Test konkretnego pliku konfiguracyjnego
sudo logrotate -d /etc/logrotate.d/nginx
Opcja -d
(debug) pokazuje, co logrotate zrobiłby, ale bez faktycznego wykonywania zmian.
Wymuszenie rotacji (niezależnie od harmonogramu)
Aby wymusić rotację, niezależnie od ustalonych warunków:
# Wymuszenie rotacji wszystkich logów
sudo logrotate -f /etc/logrotate.conf
# Wymuszenie rotacji konkretnej konfiguracji
sudo logrotate -f /etc/logrotate.d/aplikacja
Rozwiązywanie typowych problemów
Problem: Logi nie są rotowane pomimo spełnienia warunków
Możliwe przyczyny i rozwiązania:
- Sprawdź uprawnienia plików logów i konfiguracji
- Upewnij się, że zadanie cron jest aktywne:
ls -l /etc/cron.daily/logrotate
- Zweryfikuj ścieżki do plików logów (użyj pełnych ścieżek)
- Sprawdź stan w pliku stanu:
cat /var/lib/logrotate/status
Problem: Błędy podczas wykonywania skryptów postrotate
Możliwe przyczyny i rozwiązania:
- Sprawdź składnię skryptów
- Upewnij się, że masz odpowiednie uprawnienia
- Dodaj obsługę błędów w skryptach
- Sprawdź dziennik systemowy pod kątem błędów:
journalctl | grep logrotate
Problem: Aplikacja nadal zapisuje do starego pliku logu
Możliwe przyczyny i rozwiązania:
- Użyj opcji
copytruncate
zamiast domyślnej rotacji - Upewnij się, że postrotate odpowiednio przeładowuje aplikację
- Sprawdź, czy aplikacja wymaga sygnału do ponownego otwarcia plików logów
Monitoring i automatyzacja
Dla większych środowisk warto rozważyć monitoring procesu rotacji logów:
-
Automatyczne powiadomienia:
# W skrypcie postrotate if [ $? -ne 0 ]; then echo "Błąd rotacji logów" | mail -s "Logrotate Error" admin@example.com fi
-
Monitorowanie rozmiaru katalogów z logami:
# Skrypt do monitorowania log_size=$(du -sm /var/log | cut -f1) if [ $log_size -gt 10000 ]; then echo "Katalog /var/log przekroczył 10GB" | mail -s "Log Directory Warning" admin@example.com fi
-
Integracja z systemami monitoringu jak Nagios, Zabbix czy Prometheus
✨ Pro Tip: Rozważ użycie dedykowanych narzędzi do centralnego zbierania i analizy logów, jak Elasticsearch + Logstash + Kibana (ELK) lub Graylog, które mogą uzupełniać lokalną rotację logów.
💡 Najlepsze praktyki i optymalizacja
Strategia retencji logów
Dobrze zaprojektowana strategia retencji powinna uwzględniać:
-
Wymagania prawne i zgodność z przepisami
- Niektóre branże wymagają przechowywania logów przez określony czas
- RODO/GDPR może wpływać na okres przechowywania danych osobowych
-
Wartość operacyjną logów
- Logi błędów: dłuższy okres przechowywania (np. 30-90 dni)
- Logi dostępu: krótszy okres (np. 7-14 dni)
- Logi debugowania: bardzo krótki okres (np. 1-3 dni)
-
Dostępne zasoby
- Przestrzeń dyskowa
- Wydajność systemu podczas kompresji
Przykładowa zróżnicowana konfiguracja:
# Krytyczne logi błędów - długa retencja
/var/log/critical/*.log {
daily
rotate 90
compress
}
# Standardowe logi - średnia retencja
/var/log/standard/*.log {
daily
rotate 14
compress
}
# Logi debugowania - krótka retencja
/var/log/debug/*.log {
daily
rotate 3
compress
}
Optymalizacja kompresji
Wybór metody kompresji wpływa na rozmiar plików i obciążenie systemu:
Metoda | Współczynnik kompresji | Obciążenie CPU | Konfiguracja |
---|---|---|---|
gzip (domyślna) | Średni | Niskie | compress |
bzip2 | Wysoki | Średnie | compresscmd /usr/bin/bzip2 compressext .bz2 |
xz | Bardzo wysoki | Wysokie | compresscmd /usr/bin/xz compressext .xz |
zstd | Wysoki | Bardzo niskie | compresscmd /usr/bin/zstd compressext .zst |
Dla serwerów o dużym obciążeniu, zstd jest dobrym kompromisem między stopniem kompresji a obciążeniem procesora.
Rotacja oparta na czasie vs. rozmiarze
Strategia | Zalety | Wady |
---|---|---|
Oparta na czasie (daily, weekly) | • Przewidywalna • Zgodna z okresami raportowania • Dobra dla analizy trendów |
• Może powodować bardzo duże pliki • Ryzyko zapełnienia dysku przy nagłym wzroście logów |
Oparta na rozmiarze (size) | • Kontrola nad rozmiarem plików • Ochrona przed zapełnieniem dysku • Bardziej równomierne pliki |
• Nieprzewidywalna częstotliwość • Trudniejsza korelacja z czasem • Może powodować zbyt częste rotacje |
Hybrydowa (oba warunki) | • Najlepsza kontrola • Elastyczność • Bezpieczeństwo |
• Bardziej złożona konfiguracja • Trudniejsza do zrozumienia |
Przykład konfiguracji hybrydowej:
/var/log/aplikacja.log {
# Rotacja dzienna...
daily
# ...ale również gdy plik przekroczy 100MB
maxsize 100M
# ...i nie rotuj, jeśli plik jest mniejszy niż 1MB
minsize 1M
rotate 14
compress
}
✅ Checklista optymalizacji logrotate:
- 🔍 Dostosuj częstotliwość rotacji do tempa generowania logów
- 🔄 Zróżnicuj okres retencji w zależności od ważności logów
- 🔒 Ustaw odpowiednie uprawnienia dla nowych plików logów
- 📱 Dodaj powiadomienia o błędach rotacji
- 🛡️ Używaj
sharedscripts
dla wspólnych skryptów postrotate - 📊 Monitoruj rozmiar katalogów z logami
- 🕸️ Rozważ archiwizację najważniejszych logów w zewnętrznym systemie
- 🚀 Optymalizuj kompresję dla równowagi między rozmiarem a wydajnością
❓ FAQ - Odpowiedzi na Twoje Pytania
Czy logrotate automatycznie usuwa stare logi?
Tak, dzięki dyrektywie rotate n
, gdzie n oznacza liczbę zrotowanych plików do zachowania. Po przekroczeniu tej liczby, najstarsze pliki są usuwane. Alternatywnie, można użyć maxage n
do usuwania plików starszych niż n dni.
Jak mogę rotować logi aplikacji, która stale trzyma otwarty plik logu?
Dla takich aplikacji najlepiej użyć opcji copytruncate
, która kopiuje zawartość pliku, a następnie czyści oryginał, zamiast go przenosić. Należy pamiętać, że istnieje niewielkie ryzyko utraty danych zapisywanych dokładnie w momencie rotacji.
Czy mogę używać logrotate dla aplikacji działających w kontenerach Docker?
Tak, ale wymaga to dodatkowej konfiguracji. Możesz:
- Skonfigurować logrotate wewnątrz kontenera
- Zamontować logi jako wolumen i rotować je na hoście
- Użyć wbudowanych mechanizmów rotacji sterownika logowania Docker (json-file z opcjami)
- Przekierować logi do zewnętrznego systemu (np. syslog, fluentd)
Jak często wykonywany jest logrotate?
Domyślnie logrotate jest uruchamiany codziennie przez zadanie cron w /etc/cron.daily/
. Można to zmienić, przenosząc skrypt do innego katalogu cron lub tworząc własne zadanie crontab z inną częstotliwością.
Co się stanie, jeśli dysk zapełni się przed zaplanowaną rotacją?
Logrotate sam w sobie nie monitoruje zapełnienia dysku. Aby zabezpieczyć się przed taką sytuacją, można:
- Użyć opcji
size
lubmaxsize
do rotacji opartej na rozmiarze pliku - Skonfigurować monitoring dysku z automatycznymi akcjami
- Użyć systemd do automatycznego uruchamiania logrotate przy wysokim zapełnieniu dysku
🏁 Podsumowanie - Efektywne zarządzanie logami
Poprawnie skonfigurowany logrotate jest niezbędnym elementem zarządzania serwerem Linux, zapewniając:
- Kontrolę nad rozmiarem plików logów - zapobieganie zapełnieniu dysku
- Organizację historycznych logów - ułatwienie wyszukiwania i analizy
- Automatyzację rutynowych zadań - oszczędność czasu administratora
- Zgodność z wymogami retencji danych - spełnienie wymagań prawnych i firmowych
Pamiętaj, że efektywne zarządzanie logami to nie tylko ich rotacja, ale cały ekosystem praktyk:
- Odpowiednia konfiguracja poziomów logowania aplikacji
- Regularna analiza logów
- Monitorowanie pod kątem błędów i zagrożeń bezpieczeństwa
- Centralizacja logów w większych środowiskach
Inwestycja czasu w prawidłową konfigurację logrotate zwraca się wielokrotnie, oszczędzając czas przy rozwiązywaniu problemów, unikaniu awarii związanych z zapełnionym dyskiem i zapewniając dostęp do historycznych danych, gdy są potrzebne.
🚀 Potrzebujesz profesjonalnego hostingu z zarządzanymi serwerami Linux?
Sprawdź ofertę hostingu w IQHost
W IQHost oferujemy w pełni zarządzane serwery z optymalnie skonfigurowaną rotacją logów, monitoringiem i alertami. Nasz zespół ekspertów dba o bezpieczeństwo i wydajność, dzięki czemu możesz skupić się na swoim biznesie, a nie na administracji serwerem.
Czy ten artykuł był pomocny?
Twoja strona WordPress działa wolno?
Sprawdź nasz hosting WordPress z ultraszybkimi dyskami NVMe i konfiguracją serwera zoptymalizowaną pod kątem wydajności. Doświadcz różnicy już dziś!
Sprawdź ofertę hostingu