日志轮换后,Rsyslog 停止向远程服务器发送数据

日志轮换后,Rsyslog 停止向远程服务器发送数据

在我的配置中,我有一个 rsyslog,它负责跟踪/home/user/my_app/shared/log/unicorn.stderr.log使用的更改imfile。内容使用 TCP 发送到另一个远程日志服务器。

当日志文件轮换时,rsyslog 停止向远程服务器发送数据。

我尝试重新加载 rsyslog,发送 HUP 信号并重新启动它,但没有任何效果。

我发现唯一真正有效的方式是:

  • 停止服务,删除 rsyslog 统计文件并重新启动 rsyslog。所有这些都在我的 logrotate 文件的 postrotate 钩子中。
  • kill -9rsyslog 并重新启动。

有没有恰当的有什么方法可以在不触碰 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 继续跟踪现在​​重命名的文件的文件句柄。

相关内容