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

Vin*_* B. 9 linux logrotate rsyslog

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

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

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

我发现实际有效的唯一方法是肮脏的:

  • 停止服务,删除 rsyslog stat 文件并再次启动 rsyslog。所有这些都在我的 logrotate 文件中的 postrotate 钩子中。
  • 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。

Vin*_* B. 8

问题实际上来自 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)

  • 我不记得什么时候了,但我确实将 `post-rotate` 更改为 `lastaction`。您的评论仍然非常明智,当时可能已经解决了我的问题:)。不过,作为记录,我将避免在将来使用 `copytruncate`,因为它很慢并且使用文件句柄播放。 (2认同)