Rsyslog przestaje wysyłać dane do zdalnego serwera po rotacji dziennika

9

W mojej konfiguracji mam rsyslog, który odpowiada za następujące zmiany /home/user/my_app/shared/log/unicorn.stderr.loguż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.

Vincent B.
źródło

Odpowiedzi:

8

Problem faktycznie pochodził z Logrotate.

Zasadniczo w mojej konfiguracji, z jednorożcem, nie muszę używać copytruncatedyrektywy. (co powoduje tutaj problemy)

USR1 - Otwórz ponownie wszystkie dzienniki będące własnością procesu roboczego. Zobacz Unicorn :: Util.reopen_logs, aby dowiedzieć się, co jest uważane za dziennik. Pliki dziennika nie są ponownie otwierane, dopóki nie zakończy się przetwarzanie bieżącego żądania, więc wiele wierszy dziennika dla jednego żądania (tak jak robi to Rails) nie zostanie podzielonych na wiele dzienników.

To zaczęło działać poprawnie po aktualizacji do tej konfiguracji:

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  create 640 user user
  sharedscripts

  post-rotate
    # Telling Unicorn to reload files
    test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"

    # Reloading rsyslog telling it that files have been rotated
    reload rsyslog 2>&1 || true
  endscript
}
Vincent B.
źródło
Jeśli są to bezpośrednie kopie twojego pliku, myślę, że twoim problemem był fakt, że korzystałeś post-rotate(co nie jest rzeczą) zamiast postrotate, ponieważ ten oryginalny skrypt logrotate powinien był dobrze działać z rsyslog (jeśli skrypt postrotate był uruchomiony ) ...?
mltsy
2
Nie pamiętam kiedy, ale zmieniłem się post-rotatena lastaction. Twój komentarz jest nadal bardzo rozsądny i mógł wtedy rozwiązać mój problem :). Dla przypomnienia, i tak będę unikać korzystania copytruncatew przyszłości, ponieważ jest on wolny i gra z uchwytami plików.
Vincent B.
2

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 zawiera copytruncate- tak jak jest, rsyslog zmienia nazwę bieżącego pliku i tworzy nowy, a imfile nadal śledzi uchwyt pliku o zmienionej nazwie.

Jenny D.
źródło
Przepraszamy, nazwa pliku to tylko literówka. Jednak copytruncate może być dobrym punktem. Pozwól mi tylko zajrzeć do tego :).
Vincent B.