在我的配置中,我有一个 rsyslog,它负责跟踪/home/user/my_app/shared/log/unicorn.stderr.log
使用的更改imfile
。内容使用 TCP 发送到另一个远程日志服务器。
当日志文件轮换时,rsyslog 停止向远程服务器发送数据。
我尝试重新加载 rsyslog,发送 HUP 信号并重新启动它,但没有任何效果。
我发现唯一真正有效的方式是:
- 停止服务,删除 rsyslog 统计文件并重新启动 rsyslog。所有这些都在我的 logrotate 文件的 postrotate 钩子中。
kill -9
rsyslog 并重新启动。
有没有恰当的有什么方法可以在不触碰 rsyslog 内部结构的情况下做到这一点?
Rsyslog文件
$ModLoad 标记 $ModLoad imudp $ModLoad imtcp $ModLoad imuxsock $ModLoad imklog $ModLoad 图像文件 $template WithoutTimeFormat,“[环境] [%syslogtag%] -- %msg%” $工作目录 /var/spool/rsyslog $输入文件名 /home/user/my_app/shared/log/unicorn.stderr.log $InputFileTag unicorn-stderr $InputFileStateFile stat-unicorn-stderr $InputFileSeverity 信息 $输入文件设施 local8 $输入文件轮询间隔 1 $输入文件持久状态间隔 1 $输入运行文件监控器 # 转发到远程服务器 如果 $syslogtag 包含“apache-”,则 @@my_server:5000;WithoutTimeFormat :syslogtag,包含,“apache-”〜 *.* @@my_server:5000;Sysl格式
Logrotate文件
/home/user/my_app/shared/log/*.log { 日常的 missok 日期文本 旋转 30 压缩 通知为空 延伸 gz 复制截断 创建 640 个用户 共享脚本 后旋转 (停止 rsyslog && rm /var/spool/rsyslog/stat-* && 启动 rsyslog 2>&1)|| true 结束语 }
仅供参考,该文件对于 rsyslog 用户可以读取,我的服务器可以访问,并且其他不以相同周期轮换的日志文件将继续被正确跟踪。
我正在运行 Ubuntu 12.04。
答案1
问题实际上来自 logrotate。
基本上,使用我的配置,运行 unicorn,我不需要使用指令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
}
答案2
您的 logrotate 文件包含 的条目/home/user/shared/log/*.log
,它与 中的日志文件不匹配/home/user/my_app/shared/log/unicorn.stderr.log
。您需要为该目录添加一个 logrotate 条目,并确保它包含copytruncate
- 因为 rsyslog 正在重命名当前文件并创建一个新文件,并且 imfile 继续跟踪现在重命名的文件的文件句柄。