如果我说得含糊不清,请原谅我,但我会尽力保证其尽可能的安全。
我有一台 CentOS 服务器,设置为中央远程日志服务器。几个月来,服务器一直将日志发送到此服务器,没有出现任何问题。这些日志文件每月滚动一次,并且一直运行正常。然而,本月(据我所知,没有任何配置更改)rsyslog 决定将新日志文件发送到滚动日志文件 ( access_log-20150901
),而不是未滚动文件 ( access_log
)。
奇怪的是,我甚至将滚动日志(access_log-20150901
)移动到了档案目录,而 rsyslog 仍然在向该文件发送更新。
我正在使用自定义过滤器,如下所示:
if $programname contains 'access_log' then /var/log/remotelog/access_log
但是它正在更新文件:
/var/log/remotelog/archive/access_log-20150901
有人知道这里发生了什么事吗?
仅供参考。所有这些文件和文件夹的权限都是相同的。
编辑:修复了 logrotate,使用 postrotate 方法在日志轮换后重新启动 rsyslog
/var/log/remotelog/access_log
{
missingok
notifempty
monthly
create 0660 <user> <group>
rotate 12
postrotate
/sbin/service rsyslog reload > /dev/null 2>/dev/null || true
endscript
}
rsyslog版本:rsyslogd 8.9.0.ad1
答案1
在我看来,这里您有两个基本选择。
1) 在 logrotate 节中添加“postrotate”子句,以向 rsyslog pid 发出 HUP
2)将此文件添加到rsyslog filespec文件中/etc/logrotate.d/rsyslog
。
问题是您在旋转后从未重新启动 rsyslog 守护进程,因此它仍然在内部保留旧的文件句柄。到目前为止,它可能运行良好,因为 rsyslog 文件的旋转比此文件的旋转花费的时间更长,这意味着 rsyslog 文件的 HUP 是在该文件旋转之后发生的。最近,此旋转花费的时间比 rsyslog 文件花费的时间更长,因此 HUP 发生在此日志文件关闭/旋转之前。HUP 之后,rsyslog
仍然打开旧文件,并且旋转从未通知 rsyslog 更新其内部文件句柄。