Logrotate nie działa

18

Próbuję zmusić Logrotate do pracy na moim VPS, aby co tydzień obracać plikami apache. Obecnie zawartość pliku konfiguracyjnego apache2 jest taka.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

Zostawiłem to już od dwóch tygodni i o ile wiem, nic się nie zmieniło. Kiedy symuluję to z wiersza poleceń, otrzymuję następujący wynik.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

Wszelkie pomysły na to, co źle skonfigurował Iv'e?

Mój plik statusu też jest pusty :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Aktualizacja

Usunąłem plik statusu i przeprowadziłem wymuszone uruchomienie programu logrotate, a teraz dzienniki wyglądają, jakby zostały obrócone, a plik statusu wygląda bardziej obiecująco!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Malachiasz
źródło

Odpowiedzi:

17

Myślę, że weeklyto oznacza, że ​​Logrotate chce zobaczyć co najmniej tygodniowy wpis dla pliku access.log, aby go obrócić.

Dlatego wydaje się, że problem polega na tym, że nie zapisujesz wpisu stanu, aby uruchomić obrót.


Oto krok po kroku przykład prostego przypadku, w którym Logrotate decyduje się na obrócenie pliku dziennika
(są to ścieżki fedora, Ubuntu, Centos itp. Mogą być różne)

(Złożyłem kilka próśb, http://localhostwięc w access_log jest kilka wpisów, w przeciwnym razie logrotate nigdy się nie obraca ...)

Tak więc ustawiłem mój logrotate na apache tak jak co tydzień;

/var/log/httpd/*log {
        weekly
...
}

i pierwotnie nie ma wpisu w /var/lib/logrotate.statuspliku

# grep access_log /var/lib/logrotate.status
<- nothing

Więc logrotate nie obraca access_logpliku;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

Jeśli jednak uruchomię logrotate ręcznie tak;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

w pliku stanu znajduje się teraz wpis dla httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

Jednak Apache nadal nie będzie obracał dziennika, ponieważ wpis ma tylko 0 dni (2012-5-11);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

Jednak jeśli edytujesz plik statusu za pomocą vi, vi /var/lib/logrotate.statuswięc coś takiego, aby ustawić datę na ponad tydzień ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Następnie logrotate teraz poprawnie obraca plik, ponieważ data w pliku stanu 2012-4-11jest większa niż tydzień temu od dzisiaj2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(pamiętaj, że -dpowoduje to suchobieg, dlatego jest przydatny tylko do kontroli, musisz faktycznie uruchomić polecenie bez -dwprowadzania wpisów stanu lub obracania plików itp.)

Tom H.
źródło
1
Pliki dziennika miały wpisy sprzed ponad tygodnia - Wygląda na to, że teraz działa, ale chyba dowiem się za tydzień ...
Malachi
2
Przepraszam, mogłem być bardziej jednoznaczny w odpowiedzi, ale myślę, że dla cotygodniowego rotacji wymaga wpisu w pliku /var/lib/logrotate.statusz datą co najmniej tygodniową. Zaktualizowałem odpowiedź za pomocą przykładu ...
Tom H
Dzięki za takie jasne wytłumaczenie - całkowicie rozumiem datę rzeczy, po prostu nie obracają się, chyba że ręcznie wywołam polecenie ... To tak, jakby CRON nie nazywał obracania dziennika?
Malachi
Jestem względnie nowy w administrowaniu Linuksem ... Wewnątrz /etc/cron.daily/logrotate/ jest: #! / Bin / sh test -x / usr / sbin / logrotate || zjazd 0
Malachi
7
log does not need rotating

Może to być spowodowane tym, że pliki dziennika są puste.
Taka sytuacja może się zdarzyć, ponieważ apache nadal zapisuje w poprzednim pliku dziennika, którego nazwa została zmieniona bez ponownego uruchamiania apache. Access.log stał się access.log.1 i Apache zapisuje w nim.

Lub masz problem z czasem tworzenia dziennika:

ls -al --time=ctime /var/www/user/site.com/logs/
Gregory MOUSSAT
źródło
Możesz skomentować notifemptylinię, aby poradzić sobie z dziennikami 0-bajtowymi, które się nie obracają. Następnie będziesz chciał touchnowego pliku dziennika przed każdym testem, aby logrotate miał coś do obrócenia.
Banjer
6

Napotkałem podobny problem, ale żadna z tych odpowiedzi mi nie pomogła. Mój plik dziennika był ogromny i stary, moja konfiguracja była w 100% poprawna i poprawna, usunięcie pliku statusu nie pomogło.

Okazało się, że problemem były zduplikowane wpisy logrotate . Kiedy uruchamiam logrotate ręcznie na moim pliku konfiguracyjnym tylko w ten sposób:

logrotate -df /etc/logrotate.d/my_service_name

nie pokazał żadnych błędów, po prostu powiedział:

log does not need rotating

Nadal nie wiem dlaczego. Ale kiedy uruchomię takie pełne polecenie logrotate:

logrotate -f /etc/logrotate.conf

Mam następujący wiersz:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Okazało się, że plik konfiguracyjny logrotate dla mojej usługi zawierał wpisy dotyczące obracania dzienników dostępu nginx, a także samych dzienników usługi. I to kolidowało z konfiguracją ngnix logrotate, która ma regułę dla wszystkich wpisów nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

Więc rozwiązanie dla mojej sprawy jest dość proste: po prostu musiałem usunąć sprzeczną regułę rotacji logów nginx z mojej konfiguracji .

Przypuszczam, że logrotate zaczął przerywać przetwarzanie pliku w przypadku konfliktu reguł tylko z jednej z najnowszych wersji. Pojawia się ten błąd w wersji 3.7.7, ale w wersji 3.7.7 z tą samą sprzeczną konfiguracją zapisuje ten sam błąd, ale obraca się dobrze. Chociaż nie mogłem znaleźć żadnego zapisu w dzienniku zmian Logrotate.

Innokenty
źródło
masz rację co do najnowszych wersji. Miałem też zduplikowane wpisy; ale podczas ręcznego uruchamiania logrotate; działało dobrze. W nocy zwróć wartość 0; ale nie działało poprawnie ...
Chris Maes
2

Spróbuj uruchomić sudo logrotate -f --verbose /etc/logrotate.d/apache2 Zobacz, co napisano w konsoli i napraw wszystko, co jest nie tak.

Aminah Nuraini
źródło
0

Miałem maszynę Debian 7, która po aktualizacji systemu nie obracała już dzienników poczty. Wszystkie inne dzienniki oprócz dzienników zostały poprawnie obrócone. Odkryłem, że dzienniki poczty wzrosły o kilka gigabajtów. Zawsze zarządzałem rotacją logów przez Webmin. Następnie działając logrotate -d /etc/logrotate.confzobaczyłem następujący komunikat:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

Okazało się, że moje wpisy rotacji poczty zostały wymienione /etc/logrotate.d/rsyslog.dpkg-old, co zostało zignorowane! Zmiana nazwy pliku naprawiła rotację pliku dziennika :-)

Lucaferrario
źródło