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ć.
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
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. –
Na jakim komputerze działasz, być może jest to specyficzny problem z Ubuntu? – TristanMatthews