Twoja konfiguracja logrotate wygląda poprawnie na pierwszy rzut oka, ale puste nowe pliki logów po rotacji to typowy objaw problemu z sygnałem do Apacha o ponownym otwarciu plików logów po rotacji. Oto najczęstsze przyczyny i rozwiązania:
postrotate z sygnałem do ApachaApache trzyma otwarte uchwyty do plików logów. Po rotacji (przeniesieniu/skompresowaniu starego pliku) Apache nadal pisze do starego uchwytu, a nowy plik pozostaje pusty, ponieważ Apache nie wie, że ma zacząć pisać do nowego.
Rozwiązanie:
Dodaj blok postrotate z komendą systemctl reload apache2 (lub service apache2 reload na starszych systemach):
conf/var/log/apache2/*.log { rotate 14 daily compress delaycompress postrotate /usr/sbin/apache2ctl graceful > /dev/null 2>&1 || true endscript }
graceful – Powoduje, że Apache ponownie otwiera pliki logów bez przerywania obsługi żądań.> /dev/null 2>&1 – Tłumi komunikaty (opcjonalnie, dla czystości logów systemowych).|| true – Zapewnia, że logrotate nie zwróci błędu, jeśli komenda się nie powiedzie.Uwaga: Jeśli używasz
systemd, możesz też użyć:confpostrotate systemctl reload apache2 > /dev/null 2>&1 || true endscript
logrotate naprawdę działa(Pokaże, co zrobibashsudo logrotate -d /etc/logrotate.d/apache2
logrotate bez wprowadzania zmian.)Sprawdź, czy pliki zostały zrotowane i czy Apache pisze do nowych.bashsudo logrotate -vf /etc/logrotate.d/apache2
Pliki powinny należeć do użytkownika, pod którym działa Apache (zwyklebashls -la /var/log/apache2/
www-data):
bashsudo chown www-data:www-data /var/log/apache2/*.log sudo chmod 640 /var/log/apache2/*.log
delaycompress a puste plikidelaycompress opóźnia kompresję o jedną rotację (np. access.log.1 nie jest kompresowany, dopóki nie powstanie access.log.2).Czasamibashsudo tail -n 50 /var/log/syslog sudo journalctl -u apache2 --no-pager -n 50
logrotate lub Apache zgłaszają tam błędy (np. brak uprawnień, nieznaleziony plik).postrotate z apache2ctl graceful lub systemctl reload apache2.logrotate -d i logrotate -vf.Czy po dodaniu postrotate problem zniknął? Jeśli nie, sprawdź, czy Apache nie używa innej ścieżki do logów (np. przez ErrorLog w konfiguracji wirtualnych hostów).