我遇到了一个问题,即 rsyslog 在 logrotate 之后停止将 httpd 日志转发到我们的中央日志存储库。服务器是 RHEL7。到目前为止,我的调查结果如下:
(in /var/lib/rsyslog)
#: grep httpd * |grep access |awk -F: '{print $1":"$2}' |xargs ls -ltr
-rw-------. 1 root root 103 Jul 14 11:35 imfile-state:137457168
-rw-------. 1 root root 103 Jul 14 11:42 imfile-state:137457173
-rw-------. 1 root root 103 Jul 19 03:20 imfile-state:137457170
-rw-------. 1 root root 101 Jul 27 12:40 imfile-state:137457166
# ls -i /var/log/httpd/access.log
137457166 /var/log/httpd/access.log
因此,httpd 访问日志的 rsyslog imfile-state:inode 文件确实存在。查看该文件可以让我了解 rsyslog 使用的偏移量,这样它就不会在重新启动时重新发送旧数据。
#: cat imfile-state:137457166
{ "filename": "\/var\/log\/httpd\/access.log", "prev_was_nl": 0, "curr_offs": 8305123, "strt_offs": 8305123 }
但是,当我使用 vim 打开 /var/log/httpd/access.log 并输入 :goto 8305123 时,它会将我带到文件中的最后一个字符,这表明它尚未达到该数字(新文件比该数字小得多的事实进一步证实了这一点)。因此,似乎在 logrotate 运行后,rsyslog 会发现有一个新的日志文件需要跟踪,但会将旧日志文件的最后一个字节位置记录到新的 imfile-state:inode 文件中。
由于新的 /var/log/httpd/access.log 文件从零字节开始,rsyslog 停止转发该日志中的任何行,直到它包含足够的内容以达到并随后超越 imfile-state: 文件中的字节位置。
httpd 的 logrotate 配置文件是:
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
并且从新轮换的 /var/log/messages.1 中的最后三行,我可以看到 rsyslog 在 httpd.service 重新加载后立即被 HUP:
2020-07-26T03:26:02.912066+09:30 <hostname> systemd: Reloading The Apache HTTP Server.
2020-07-26T03:26:02.982370+09:30 <hostname> systemd: Reloaded The Apache HTTP Server.
2020-07-26T03:26:03.088887+09:30 <hostname> rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-41.el7_7.2" x-pid="61518" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
rsyslog版本:rsyslog-8.24.0-41.el7_7.2.x86_64
我正绞尽脑汁想解决这个问题。其他日志文件的 logrotate 和 rsyslog 配置几乎相同,并且在旋转后仍继续运行。任何帮助都将不胜感激。