1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Logrotate — rotacja logów na VPS

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

Opublikowano: 9 kwietnia 2026 · Kategoria: VPS

⚡ W skrócie · 7 min czytania

-   Logrotate na VPS: konfiguracja rotacji logów nginx, Apache, MySQL, PHP-FPM i własnych aplikacji. Kompresja, retencja, sygnały postrotate i dry-run troubleshooting.
-   Jak działa logrotate.
-   Konfiguracja nginx.
-   Konfiguracja MySQL / MariaDB.
-   Konfiguracja PHP-FPM.

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 /

## 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.

Contabo

VPS z dużym dyskiem NVMe — logi nie zapełnią Ci serwera

Duży dysk NVMe

[Aktywuj rabat →](/out/contabo/#reklama "Contabo")

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikr.us

Budżetowy VPS — logrotate obowiązkowy przy ograniczonej przestrzeni

Budżetowy VPS

[Aktywuj rabat →](/out/mikrus/#reklama "Mikr.us")

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

ProSerwer.pl

Polski VPS z pełnym dostępem root i supportem

Polski VPS

[Aktywuj rabat →](/out/proserwer-pl/#reklama "ProSerwer.pl")

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/proserwer)

## Powiązane strony

-   [Logi serwera Apache i Nginx — analiza](/baza-wiedzy/logi-serwera-apache-nginx)
-   [rsync — kopia zapasowa VPS krok po kroku](/baza-wiedzy/rsync-kopia-zapasowa-vps)
-   [UFW Firewall — konfiguracja na VPS](/baza-wiedzy/ufw-firewall-konfiguracja)
-   [MySQL na hostingu — konfiguracja i optymalizacja](/baza-wiedzy/mysql-baza-danych-hosting)
-   [Wszystkie artykuły](/baza-wiedzy/)

Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Czerwiec 2026

Administruje własnymi serwerami VPS i dedykowanymi, testując konfiguracje pod realnym obciążeniem — nie w sandboxie. W HostGrade.pl buduje bazę wiedzy DevOps: przewodniki po konfiguracji Nginx, Dockera, Redis i backupów serwerowych pisane na podstawie realnych deploymentów. Porównuje parametry techniczne planów VPS: gwarantowane vCPU kontra shared core, przepustowość sieci i IOPS dysków NVMe. Specjalizuje się w hardening serwera Linux — od fail2ban przez iptables po audyty CIS Benchmark. Każdy artykuł techniczny przechodzi przez środowisko testowe: konfiguracja Redis Cluster, setup HAProxy czy skrypt backup z BorgBackup są uruchamiane przed publikacją. Wierzy, że dobry tutorial kończy się komendą, której wynik faktycznie działa.

[Pełny profil autora →](/autorzy/adam-nadolny)