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.log → access.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 /