Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

Logrotate — konfiguracja rotacji logów na VPS i hostingu Linux

Opublikowano: 9 kwietnia 2026 · Kategoria: VPS

Plik logu nginx rosnący przez miesiąc może osiągnąć kilkaset megabajtów. Na małym VPS z 20 GB dysku to poważny problem. Logrotate to standardowe narzędzie Linux do automatycznego zarządzania logami — rotuje je codziennie lub tygodniowo, kompresuje stare pliki i usuwa najstarsze. Większość dystrybucji Linux ma logrotate zainstalowany domyślnie.

Jak działa logrotate

Logrotate uruchamiany jest przez cron (domyślnie raz dziennie, zwykle o 6:25). Sprawdza wszystkie konfiguracje w /etc/logrotate.d/ i dla każdej decyduje, czy nadszedł czas na rotację. Rotacja = zmiana nazwy aktualnego pliku logu (np. access.logaccess.log.1), opcjonalna kompresja do access.log.1.gz, wysłanie sygnału do procesu żeby otworzył nowy plik i usunięcie logów starszych niż limit retencji.

Konfiguracja nginx

Domyślna konfiguracja nginx w /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    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
        # Sygnał do nginx żeby otworzył nowy plik logu
        invoke-rc.d nginx rotate >/dev/null 2>&1
    endscript
}

Konfiguracja 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
    delaycompress
    sharedscripts
    postrotate
        test -x /usr/bin/mysqladmin || exit 0
        # Flush logs po rotacji
        if [ -f /var/run/mysqld/mysqld.pid ] && kill -0 $(cat /var/run/mysqld/mysqld.pid) 2>/dev/null; then
            mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs
        fi
    endscript
}

Konfiguracja PHP-FPM

/var/log/php8.2-fpm.log {
    rotate 12
    weekly
    missingok
    notifempty
    compress
    delaycompress
    postrotate
        /usr/lib/php/php8.2-fpm-reopenlogs
    endscript
}

Konfiguracja własnej aplikacji

Dla własnej aplikacji Python/Node.js utwórz /etc/logrotate.d/myapp:

/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0644 myappuser myappuser
    sharedscripts
    postrotate
        # Wyślij sygnał USR1 do procesu żeby otworzył nowy plik
        [ -f /run/myapp.pid ] && kill -USR1 $(cat /run/myapp.pid) || true
    endscript
}

Kluczowe opcje konfiguracji

Opcja Znaczenie Przykład
daily / weekly / monthly Częstotliwość rotacji daily
rotate N Liczba kopii do przechowania rotate 14 (2 tygodnie)
compress Kompresja gzip starych logów Oszczędność ~70% miejsca
delaycompress Kompresja od drugiej kopii Zapobiega problemom z otwartymi plikami
missingok Nie błęduj gdy brak pliku Przydatne gdy app nie startuje
notifempty Nie rotuj pustych plików Oszczędza miejsce
create MODE USER GROUP Uprawnienia nowego pliku logu create 0644 nginx adm
size N Rotuj gdy rozmiar przekroczy N size 100M
maxsize N Rotuj gdy rozmiar LUB czas maxsize 50M + weekly

Testowanie i troubleshooting

# Dry-run — pokaż co zostałoby zrotowane (bez zmian)
sudo logrotate -d /etc/logrotate.conf

# Dry-run dla konkretnego pliku konfiguracyjnego
sudo logrotate -d /etc/logrotate.d/nginx

# Wymuś rotację natychmiastowo (ignoruje ograniczenia czasu)
sudo logrotate -f /etc/logrotate.d/nginx

# Status ostatnich rotacji
cat /var/lib/logrotate/status | head -20

# Sprawdź logi cron (kiedy ostatnio uruchamiał się logrotate)
grep logrotate /var/log/syslog | tail -5

# Diagnostyka: sprawdź uprawnienia do pliku logu
ls -la /var/log/nginx/

Ręczne sprawdzenie rozmiaru logów

# Rozmiar katalogu /var/log
sudo du -sh /var/log/*

# 10 największych plików logów
sudo find /var/log -type f -exec du -h {} + | sort -rh | head -10

# Wolne miejsce na dysku
df -h /

Najczęstsze pytania

Co to jest logrotate i po co go używać? +
Logrotate to narzędzie dla systemów Linux do automatycznej rotacji, kompresji i usuwania plików logów. Bez logrotate logi systemowe (nginx, Apache, MySQL, PHP-FPM) rosną bez ograniczeń i mogą zapełnić dysk VPS. Logrotate dzieli logi na segmenty (daily/weekly), kompresuje stare pliki i usuwa najstarsze, utrzymując dysk w porządku.
Jak sprawdzić czy logrotate działa? +
sudo logrotate -d /etc/logrotate.conf — dry-run, pokazuje co zostałoby zrotowane bez rzeczywistych zmian. sudo logrotate -f /etc/logrotate.conf — wymuś rotację natychmiastowo. Status ostatniej rotacji: cat /var/lib/logrotate/status. Logi logrotate: /var/log/syslog lub journalctl -u logrotate.
Jak skonfigurować logrotate dla własnej aplikacji? +
Utwórz plik /etc/logrotate.d/myapp z zawartością: /var/log/myapp/*.log { daily compress delaycompress missingok rotate 14 notifempty sharedscripts postrotate kill -USR1 $(cat /run/myapp.pid) endscript }. Sygnał USR1 mówi procesowi żeby otworzył nowy plik logu po rotacji.
Dlaczego logi nginx/Apache nie rotują się poprawnie? +
Najczęstszy błąd: brak sygnału do procesu po rotacji. Nginx po rotacji nadal zapisuje do starego pliku dopóki nie dostanie sygnału USR1 (nginx -s reopen). Dodaj w sekcji postrotate: [ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid). Dla Apache: apache2ctl graceful lub service apache2 reload.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.