Vin*_* B. 9 linux logrotate rsyslog
在我的配置中,我有 rsyslog 负责跟踪/home/user/my_app/shared/log/unicorn.stderr.log
使用imfile
. 使用 TCP 将内容发送到另一个远程日志服务器。
当日志文件轮换时,rsyslog 停止向远程服务器发送数据。
我尝试重新加载 rsyslog,发送 HUP 信号并完全重新启动它,但没有任何效果。
我发现实际有效的唯一方法是肮脏的:
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 unicorn-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 { 日常的 错过了 日期文本 旋转 30 压缩 通知空 扩展名 复制截断 创建 640 个用户用户 共享脚本 旋转后 (停止 rsyslog && rm /var/spool/rsyslog/stat-* && 开始 rsyslog 2>&1) || 真的 尾标 }
仅供参考,该文件对于 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
}
Run Code Online (Sandbox Code Playgroud)