В моей конфигурации у меня есть rsyslog, который отвечает за следующие изменения /home/user/my_app/shared/log/unicorn.stderr.log
с помощью imfile
. Контент отправляется на другой удаленный сервер регистрации по протоколу TCP.
При ротации файла журнала rsyslog перестает отправлять данные на удаленный сервер.
Я попытался перезагрузить rsyslog, отправить сигнал HUP и полностью перезапустить его, но ничего не помогло.
Единственные способы, которые я мог найти, действительно работали, были грязными:
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 unicorn-stderr $InputFileStateFile stat-unicorn-stderr $InputFileSeverity info $InputFileFacility local8 $InputFilePollInterval 1 $InputFilePersistStateInterval 1 $InputRunFileMonitor # Forward to remote server if $syslogtag contains 'apache-' then @@my_server:5000;WithoutTimeFormat :syslogtag, contains, "apache-" ~ *.* @@my_server:5000;SyslFormat
Файл Logrotate
/home/user/my_app/shared/log/*.log { daily missingok dateext rotate 30 compress notifempty extension gz copytruncate create 640 user user sharedscripts post-rotate (stop rsyslog && rm /var/spool/rsyslog/stat-* && start rsyslog 2>&1) || true endscript }
К вашему сведению, файл доступен для чтения для пользователя rsyslog, мой сервер доступен, а другие файлы журнала, которые не вращаются в том же цикле, продолжают отслеживаться должным образом.
Я использую Ubuntu 12.04.
На самом деле проблема возникла из-за 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
}
Ваш файл logrotate содержит запись для /home/user/shared/log/*.log
, который не соответствует вашему лог-файлу в /home/user/my_app/shared/log/unicorn.stderr.log
. Вам нужно добавить запись logrotate для этого каталога и убедиться, что он содержит copytruncate
- как есть, rsyslog переименовывает текущий файл и создает новый, а imfile продолжает следовать за дескриптором теперь переименованного файла.