Rsyslog припиняє надсилати дані на віддалений сервер після обертання журналу


9

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

Коли файл журналу обертається, rsyslog перестає надсилати дані на віддалений сервер.

Я спробував перезавантажити rsyslog, надіслав сигнал HUP і повністю перезапустив його, але нічого не вийшло.

Єдині способи, які я міг знайти, що насправді працювали, були брудними:

  • припиніть службу, видаліть файли stat rsyslog та запустити rsyslog знову. Все, що знаходиться в гачці, що знаходиться в заводі в моєму файлі logrotate.
  • kill -9 rsyslog і запустіть його заново.

Чи є для мене правильний спосіб зробити це, не торкаючись внутрішніх даних rsyslog?

Файл Rsyslog

$ ModLoad позначка
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
Імфіляція $ ModLoad

$ template WithoutTimeFormat, "[середовище] [% syslogtag%] -% msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag єдиноріг-stderr
$ InputFileStateFile stat-unicorn-stderr
$ InputFileSeverity інформація
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# Переслати на віддалений сервер
якщо $ syslogtag містить 'apache-', то @@ my_server: 5000; WithoutTimeFormat
: syslogtag, містить, "apache-" ~

*. * @@ my_server: 5000; SyslFormat

Файл логротету

/home/user/my_app/shared/log/*.log {
  щодня
  пропуск
  dateext
  обертати 30
  компрес
  notifempty
  розширення gz
  копіювати
  створити 640 користувачів користувача
  спільні сценарії
  поворот
    (зупинити rsyslog && rm / var / spool / rsyslog / stat- * && start rsyslog 2> & 1) || правда
  закінчення
}

FYI, файл читається для користувача rsyslog, мій сервер доступний, а інші файли журналів, які не обертаються в одному циклі, продовжують відстежуватися належним чином.

Я запускаю Ubuntu 12.04.

Відповіді:


8

Проблема була насправді від логротату.

В основному з моєю конфігурацією, під управлінням єдиноріг, мені не потрібно використовувати 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. Вам потрібно додати логротатну запис для цього каталогу та переконайтесь, що він містить copytruncate- як він є, rsyslog перейменовує поточний файл та створює новий, а imfile продовжує керуватися файловим файлом тепер перейменованого файлу.


Вибачте, ім'я файлу - це просто помилка. Однак копірайтенація може бути хорошим моментом. Дозвольте мені просто розглянути це :).
Вінсент Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.