Rotacja i kompresja logów za pomocą logrotate | INTROSERV
EUR
european

EUR

usa

USD

Poland Pl
Ex. VAT Ex. VAT 0%

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:

  1. daily – rotować dzienniki codziennie; możesz również określić weekly lub monthly.
  2. missingok – nie zgłaszać błędu, jeśli plik dziennika jest nieobecny.
  3. rotate 14 – przechowywać 14 zrotowanych kopii przed usunięciem.
  4. compress – kompresować zrotowane dzienniki za pomocą gzip.
  5. delaycompress – nie kompresować najnowszej rotacji; przydatne, jeśli aplikacja nadal trzyma plik otwarty.
  6. notifempty – pominąć rotację, jeśli plik dziennika jest pusty.
  7. 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 zazwyczaj apache lub nginx).
  8. sharedscripts – uruchomić skrypt postrotate raz, nawet jeśli dopasowano wiele plików.
  9. postrotate – sygnalizować aplikacji, aby ponownie otworzyła swoje uchwyty plików po rotacji.

Info

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

Info

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

Info

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

Info

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA