W mojej konfiguracji mam rsyslog, który odpowiada za następujące zmiany /home/user/my_app/shared/log/unicorn.stderr.log
użytkowania imfile
. Zawartość jest wysyłana do innego zdalnego serwera rejestrującego za pomocą protokołu TCP.
Gdy plik dziennika się obraca, rsyslog przestaje wysyłać dane do zdalnego serwera.
Próbowałem ponownie załadować rsyslog, wysłać sygnał HUP i zrestartować go całkowicie, ale nic nie działało.
Jedyne sposoby, w jakie mogłem stwierdzić, że faktycznie działały, były brudne:
- zatrzymaj usługę, usuń pliki statystyk rsyslog i ponownie uruchom rsyslog. Wszystko to w haczyku postrotate w moim pliku logrotate.
kill -9
rsyslog i zacznij od nowa.
Czy istnieje odpowiedni sposób, aby to zrobić bez dotykania elementów wewnętrznych rsyslog?
Plik Rsyslog
Znak jakości ModLoad $ ModLoad imudp $ ModLoad imtcp $ ModLoad imuxsock $ ModLoad imklog Imfile $ ModLoad $ template WithoutTimeFormat, „[środowisko] [% syslogtag%] -% msg%” $ WorkDirectory / var / spool / rsyslog $ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log $ InputFileTag jednorożec-stderr $ InputFileStateFile stat-jednorożec-stderr $ InputFileSeverity informacje $ InputFileFacility local8 $ InputFilePollInterval 1 $ InputFilePersistStateInterval 1 $ InputRunFileMonitor # Prześlij do zdalnego serwera jeśli $ syslogtag zawiera „apache-”, to @@ my_server: 5000; WithoutTimeFormat : syslogtag, zawiera „apache-” ~ *. * @@ mój_serwer: 5000; SyslFormat
Plik Logrotate
/home/user/my_app/shared/log/*.log { codziennie missingok datownik obróć 30 Kompresja notifempty rozszerzenie gz copytruncate utwórz 640 użytkowników skrypty współdzielone po rotacji (zatrzymaj rsyslog && rm / var / spool / rsyslog / stat- * && start rsyslog 2> i 1) || prawdziwe endcript }
Do wiadomości, plik jest czytelny dla użytkownika rsyslog, mój serwer jest osiągalny, a inne pliki dziennika, które nie obracają się w tym samym cyklu, są nadal poprawnie śledzone.
Używam Ubuntu 12.04.
post-rotate
(co nie jest rzeczą) zamiastpostrotate
, ponieważ ten oryginalny skrypt logrotate powinien był dobrze działać z rsyslog (jeśli skrypt postrotate był uruchomiony ) ...?post-rotate
nalastaction
. Twój komentarz jest nadal bardzo rozsądny i mógł wtedy rozwiązać mój problem :). Dla przypomnienia, i tak będę unikać korzystaniacopytruncate
w przyszłości, ponieważ jest on wolny i gra z uchwytami plików.Twój plik logrotate zawiera wpis dla
/home/user/shared/log/*.log
, który nie pasuje do twojego pliku dziennika/home/user/my_app/shared/log/unicorn.stderr.log
. Musisz dodać pozycję logrotate dla tego katalogu i upewnić się, że zawieracopytruncate
- tak jak jest, rsyslog zmienia nazwę bieżącego pliku i tworzy nowy, a imfile nadal śledzi uchwyt pliku o zmienionej nazwie.źródło