Rotacja i kompresja logów za pomocą logrotate
- Poziom: Średniozaawansowany
- Szacowany czas: ~20 minut
- Cel: Skonfigurować logrotate, aby automatycznie kompresować i rotować pliki dziennika aplikacji, aby zapobiec wyczerpaniu miejsca na dysku.
Wprowadzenie
Dzienniki – są kluczowym elementem zarządzania każdą aplikacją produkcyjną: bez nich zrozumienie, co poszło nie tak i co z tym zrobić, byłoby bardzo trudne. Zajęta aplikacja może generować tysiące wpisów na minutę, a wszystkie z nich są zazwyczaj przechowywane w plikach. Musimy kompresować i usuwać stare dzienniki w odpowiednim czasie, aby uniknąć wyczerpania miejsca na dysku. W tym samouczku skonfigurujemy logrotate na serwerze Linux.
Czym jest logrotate?
logrotate to narzędzie Linux zaprojektowane w celu uproszczenia administracji systemami, które generują dużą liczbę plików dziennika. Pozwala na automatyczną kompresję, rotację i usuwanie dzienników. Zazwyczaj jest uruchamiane codziennie, co tydzień lub co miesiąc za pomocą cron lub timera systemd.
Wymagania wstępne
Zanim zaczniesz, upewnij się, że spełnione są następujące warunki:
- System operacyjny: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 lub CentOS/RHEL 7+
- logrotate: wersja 3.x (sprawdź w kroku 1)
- Dostęp: dostęp sudo lub root do serwera
- Wymagana wiedza: pewne korzystanie z linii poleceń Linux i podstawowa edycja plików
Krok 1: Weryfikacja instalacji logrotate
Aby zweryfikować instalację, po prostu uruchom:
logrotate --version
Oczekiwany wynik:
logrotate 3.19.0 Domyślna komenda mail: /usr/bin/mail Domyślna komenda kompresji: /bin/gzip Domyślna komenda dekompresji: /bin/gunzip Domyślne rozszerzenie kompresji: .gz Domyślna ścieżka pliku stanu: /var/lib/logrotate/status
Jeśli polecenie nie zostanie znalezione – logrotate nie jest zainstalowany. Zainstaluj go:
Debian/Ubuntu:
sudo apt install logrotate
CentOS/RHEL:
sudo yum install logrotate
Krok 2: Zrozumienie struktury konfiguracji
Główna konfiguracja znajduje się w /etc/logrotate.conf – na razie pozostawimy ją bez zmian. Nasze zasady dla konkretnych usług umieścimy w /etc/logrotate.d/ – osobny plik powinien być tam umieszczony dla każdej usługi.
Przed dodaniem czegokolwiek, sprawdź, czy konfiguracja dla twojej usługi już istnieje:
ls /etc/logrotate.d/
Dla popularnych usług, takich jak nginx lub Apache, konfiguracje są zazwyczaj już obecne. Jeśli nginx lub apache2 jest już tam – otwórz ten plik i dostosuj liczbę rotacji i ustawienia kompresji do swoich potrzeb, zamiast tworzyć duplikat.
Krok 3: Dodawanie konfiguracji usługi
Załóżmy, że istnieje niestandardowa aplikacja, a jej dzienniki znajdują się w /opt/myapp/*.log.
Utwórz i otwórz plik:
sudo nano /etc/logrotate.d/myapp
Wklej następujące dane:
/opt/myapp/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript }
Ta konfiguracja instruuje logrotate, aby:
- daily – rotować dzienniki codziennie; możesz również określić
weeklylubmonthly. - missingok – nie zgłaszać błędu, jeśli plik dziennika jest nieobecny.
- rotate 14 – przechowywać 14 zrotowanych kopii przed usunięciem.
- compress – kompresować zrotowane dzienniki za pomocą gzip.
- delaycompress – nie kompresować najnowszej rotacji; przydatne, jeśli aplikacja nadal trzyma plik otwarty.
- notifempty – pominąć rotację, jeśli plik dziennika jest pusty.
- create 0640 www-data adm – utworzyć nowy pusty plik dziennika z określonymi uprawnieniami, właścicielem i grupą. Właściciel powinien odpowiadać użytkownikowi, pod którym działa aplikacja (w systemach opartych na Debianie często
www-data, w systemach opartych na RHEL zazwyczajapachelubnginx). - sharedscripts – uruchomić skrypt postrotate raz, nawet jeśli dopasowano wiele plików.
- postrotate – sygnalizować aplikacji, aby ponownie otworzyła swoje uchwyty plików po rotacji.
Jeśli katalog /opt/myapp/ lub pliki dziennika nie istnieją jeszcze w momencie pierwszego uruchomienia, to nie problem. Dyrektywa missingok spowoduje, że logrotate cicho pominie plik bez zgłaszania błędu. Rotacja dzienników rozpocznie się automatycznie, gdy tylko aplikacja utworzy dzienniki.
Krok 4: Testowanie konfiguracji
4.1 Suchy bieg
Po napisaniu konfiguracji należy ją zweryfikować. Flaga -d uruchamia logrotate w trybie debugowania – nic nie jest faktycznie zmieniane:
sudo logrotate -d /etc/logrotate.d/myapp
Tryb -d wyświetla informacje diagnostyczne, ale nie modyfikuje żadnych plików.
4.2 Wymuszony rzeczywisty bieg
Jeśli suchy bieg wygląda poprawnie – wymuś rzeczywistą rotację za pomocą flagi -f:
sudo logrotate -f /etc/logrotate.d/myapp
Ważne: Flaga -f wyzwala rzeczywistą rotację. Uruchom ją tylko po tym, jak testowy bieg wygląda poprawnie.
Krok 5: Weryfikacja wyniku
Po pierwszych kilku rotacjach sprawdź katalog dzienników:
ls -lh /opt/myapp/
Oczekiwany wynik:
total 28K -rw-r----- 1 www-data adm 0 Jan 17 12:00 app.log -rw-r----- 1 www-data adm 12K Jan 17 11:59 app.log.1 -rw-r----- 1 www-data adm 11K Jan 16 12:00 app.log.2.gz -rw-r----- 1 www-data adm 9K Jan 15 12:00 app.log.3.gz
Najnowsza rotacja (app.log.1) pozostaje nieskompresowana z powodu delaycompress. Wszystko starsze jest skompresowane za pomocą gzip. To dokładnie to, czego chcieliśmy.
Krok 6: Weryfikacja automatycznego harmonogramu
logrotate działa automatycznie – za pomocą cron lub timera systemd, w zależności od dystrybucji.
Systemy oparte na cron
cat /etc/cron.daily/logrotate
Jeśli plik istnieje – to jest plik, który uruchamia logrotate codziennie.
Systemy oparte na systemd
Na nowszych systemach logrotate może być uruchamiany za pomocą timera systemd zamiast cron.
Sprawdź:
systemctl list-timers | grep logrotate
Powinieneś zobaczyć timer z ostatnimi i następnymi czasami uruchomienia, coś w rodzaju:
Czw 2026-01-18 00:00:00 UTC 23h left Śr 2026-01-17 00:00:11 UTC 47 min ago logrotate.timer
Jeśli logrotate.timer jest nieobecny w wynikach – timer jest wyłączony. Włącz go:
sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
Plik stanu
Możesz sprawdzić, kiedy logrotate ostatnio działał, poprzez jego własny plik stanu:
cat /var/lib/logrotate/status
To jest własna historia rotacji logrotate. Po pierwszym rzeczywistym uruchomieniu zobaczysz każdy plik dziennika z datą jego ostatniej rotacji:
"/opt/myapp/app.log" 2026-1-17 "/var/log/nginx/access.log" 2026-1-17
Jeśli jakikolwiek dziennik nie rotuje się zgodnie z oczekiwaniami – to jest pierwsze miejsce, które należy sprawdzić.
Cofnięcie zmian
Aby cofnąć wszystko, co zostało zrobione, po prostu usuń plik konfiguracyjny z /etc/logrotate.d/:
sudo rm /etc/logrotate.d/myapp
To zatrzyma przetwarzanie dzienników dla twojej aplikacji. Już zrotowane pliki nie są usuwane.
Aby całkowicie usunąć logrotate:
Debian/Ubuntu:
sudo apt remove logrotate
CentOS/RHEL:
sudo yum remove logrotate
Ważne: Usunięcie logrotate wyłączy rotację dzienników dla całego systemu, w tym nginx, rsyslog i innych usług, które na nim polegają.
Podsumowanie
To wszystko. Jeden dobrze napisany plik w /etc/logrotate.d/, zweryfikowany za pomocą -d – i gotowe. Dzienniki pozostają czyste, dysk pozostaje zdrowy, a ty nie musisz już o tym myśleć.
Wersja dokumentu: 1.2
Ostatnia aktualizacja: Marzec 2026
Właściciel: Zespół Dokumentacji Technicznej