2016-02-09 47 views
7

Używam WatchedFileHandler jako mojego narzędzia do zapisywania pliku python, dzięki czemu mogę obracać moje logi z logrotate (na Ubuntu 14.04), o czym wiesz, co mówią doktorzy dla . Moi logrotate pliki konfiguracyjne wyglądapython WatchedFileHandler wciąż pisze do starego pliku po obrocie

/path_to_logs/*.log { 
     daily 
     rotate 365 
     size 10M 
     compress 
     delaycompress 
     missingok 
     notifempty 
     su root root 
} 

Wszystko wydawało się działać dobrze. Używam logstash do wysyłania moich dzienników do mojego klastra elasticsearch i wszystko jest świetne. Dodałem drugi plik dziennika dla moich dzienników debugowania, który jest obracany, ale nie jest obserwowany przez logstash. Zauważyłem, że gdy ten plik jest obracany, python po prostu zapisuje do /path_to_debug_logs/*.log.1 i nigdy nie rozpoczyna zapisywania do nowego pliku. Jeśli ręcznie przestawię numer /path_to_debug_logs/*.log.1, natychmiast przełącza się on i zaczyna pisać do /path_to_debug_logs/*.log.

Wydaje się to NAPRAWDĘ bardzo dziwne.

Wierzę, że to, co się dzieje, polega na tym, że logstash zawsze wyszukuje moje logi nie będące debuggowaniem, a niektóre z nich uruchamiają przełączanie do nowego pliku po wywołaniu logrotate. Jeśli nazwa logrotate zostanie wywołana dwa razy bez przełączania, plik log.1 zostanie przeniesiony i skompresowany do pliku log.2.gz, którego nie może już logować, a dzienniki są tracone.

Oczywiście istnieje kilka hacky rozwiązań tego (takich jak cronjob, który od czasu do czasu prowadzi wszystkie moje dzienniki), ale czuję, że muszę zrobić coś złego.

Używam WatchedFileHandler i logrotate zamiast RotatingFileHandler z wielu powodów, ale głównie dlatego, że ładnie skompresuje moje dzienniki po obrocie.

UPDATE:

próbowałem straszny siekać dodawania ręcznego ogona do końca mojego dziennika skryptu obrót config.

sharedscripts 
postrotate 
    /usr/bin/tail -n 1 path_to_logs/*.log.1 
endscript 

Oczywiście to działa przez większość czasu, ale losowo kończy się niepowodzeniem czasami bez wyraźnego powodu, więc nie jest rozwiązaniem. Próbowałem także wielu mniej hackowskich rozwiązań, w których zmieniłem sposób sprawdzania, czy plik się zmienił, ale nie ma szczęścia.

Jestem prawie pewien, że głównym problemem jest to, że logi są przechowywane na dysku sieciowym, co w jakiś sposób mylnie powoduje, że system plików.

Przenoszę moją rotację do pythona z RotatingFileHandler, ale jeśli ktokolwiek wie, jak to zrobić, chciałbym to wiedzieć.

Odpowiedz

0

Użyj opcji copytruncate opcji logrotate. Od docs

copytruncate

Obciąć oryginalny plik dziennika w miejscu po utworzeniu kopii, zamiast przenosić stary plik dziennika i ewentualnie utworzenie nowego, może być stosowany, gdy jakiś program nie można powiedzieć aby zamknąć swój plik dziennika i tym samym może kontynuować zapisywanie (dołączanie) do poprzedniego pliku dziennika na zawsze. Zauważ, że istnieje bardzo mały odstęp czasowy między kopiowaniem pliku a jego obcięciem, więc niektóre dane rejestrowania mogą zostać utracone. Gdy ta opcja jest używana, opcja tworzenia nie przyniesie żadnego efektu, ponieważ stary plik dziennika pozostaje w miejscu.

+0

Próbowałem wcześniej skopiować, kończy się bardzo źle. Chociaż powoduje to utworzenie nowego pliku, powoduje to bardzo dziwny błąd pythona, w którym stary plik dziennika jest pusty, który pojawia się jako "\ u0000 \ u0000 ..." w logstash, a następnie nowe komunikaty dziennika są dołączony do końca. Ma również zabawną właściwość, że twój nowy plik dziennika zaczyna się od dokładnie tego samego rozmiaru, co twój stary, po prostu pełen niczego. – TristanMatthews

+0

Dziwne, użyłem copytruncate z wieloma narzędziami python, takimi jak skrypty Pythona, supervisord, django itd. I nigdy nie spotkałem się z takim problemem. Kiedy plik zostanie obcięty, jego rozmiar jest ustawiony na 0. –

+0

Na jakim komputerze działasz, być może jest to specyficzny problem z Ubuntu? – TristanMatthews

0

WatchedFileHandler wykonuje przewracanie po wykryciu zmiany urządzenia i/lub i-węzła w pliku dziennika tuż przed zapisaniem. Być może plik, który nie jest obserwowany przez logstash, nie widzi zmiany w jego urządzeniu/i-węźle? To by wyjaśniało, dlaczego przewodnik dalej pisze do niego.