Rsyslog прекращает отправку данных на удаленный сервер после ротации журнала

9

В моей конфигурации у меня есть rsyslog, который отвечает за следующие изменения /home/user/my_app/shared/log/unicorn.stderr.logиспользования imfile. Содержимое отправляется на другой удаленный сервер регистрации по протоколу TCP.

Когда файл журнала вращается, rsyslog прекращает отправку данных на удаленный сервер.

Я попытался перезагрузить rsyslog, отправить сигнал HUP и перезапустить его, но ничего не получалось.

Единственные способы, которые я мог найти, которые действительно работали, были грязными:

  • остановите службу, удалите файлы статистики rsyslog и снова запустите rsyslog. Все это в хакере postrotate в моем файле logrotate.
  • kill -9 rsyslog и начните все сначала.

Есть ли для меня правильный способ сделать это, не касаясь внутренних rsyslog?

Rsyslog файл

$ ModLoad immark
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
$ ModLoad imfile

$ template WithoutTimeFormat, "[environment] [% syslogtag%] -% msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag единорог-stderr
$ InputFileStateFile stat-unicorn-stderr
$ InputFileSeverity info
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# Переслать на удаленный сервер
если $ syslogtag содержит «apache-», тогда @@ my_server: 5000; WithoutTimeFormat
: syslogtag, содержит, "apache-" ~

*. * @@ my_server: 5000; SyslFormat

Logrotate файл

/home/user/my_app/shared/log/*.log {
  ежедневно
  missingok
  dateext
  повернуть 30
  компресс
  notifempty
  расширение gz
  copytruncate
  создать 640 пользователей
  sharedscripts
  после поворота
    (остановите rsyslog && rm / var / spool / rsyslog / stat- * && start rsyslog 2> & 1) || правда
  endscript
}

К вашему сведению, файл доступен для чтения для пользователя rsyslog, мой сервер доступен, а другие файлы журнала, которые не вращаются в одном и том же цикле, продолжают правильно отслеживаться.

Я использую Ubuntu 12.04.

Винсент Б.
источник

Ответы:

8

Проблема на самом деле исходила от logrotate.

В основном с моей конфигурацией, работающей с единорогом, мне не нужно использовать copytruncateдирективу. (что вызывает проблемы здесь)

USR1 - вновь открыть все журналы, принадлежащие рабочему процессу. Смотрите Unicorn :: Util.reopen_logs для того, что считать журналом. Файлы журнала не открываются до тех пор, пока не будет завершена обработка текущего запроса, поэтому несколько строк журнала для одного запроса (как это делается Rails) не будут разбиты на несколько журналов.

Это начало работать правильно после обновления до этой конфигурации:

/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
}
Винсент Б.
источник
Если это прямые копии вашего файла, я думаю, что ваша проблема была в том, что вы использовали post-rotate(а это не вещь) вместо postrotate, потому что тот оригинальный скрипт logrotate, который у вас был, должен был нормально работать с rsyslog (если скрипт postrotate выполнялся ) ...?
млцы
2
Я не помню когда, но я сделал изменения post-rotateдля lastaction. Ваш комментарий все еще очень разумный и, возможно, решил мою проблему в то время :). Для записи, однако, я все copytruncateравно буду избегать использования в будущем, потому что он медленный и воспроизводится с помощью файловых дескрипторов.
Винсент Б.
2

Ваш файл logrotate содержит запись для /home/user/shared/log/*.log, которая не соответствует вашему лог- файлу в /home/user/my_app/shared/log/unicorn.stderr.log. Вам нужно добавить запись logrotate для этого каталога и убедиться, что он содержит copytruncate- как есть, rsyslog переименовывает текущий файл и создает новый, а imfile продолжает следовать дескриптору файла переименованного файла.

Дженни Д
источник
Извините, имя файла просто опечатка. Однако copytruncate может быть хорошим моментом. Позвольте мне просто посмотреть на это :).
Винсент Б.