我正在使用 Buildroot 构建嵌入式 Linux 板(此处为用户手册)。
我已经syslog-ng
在板上运行了。它的配置文件在此处的 buildroot 中指定:https://github.com/buildroot/buildroot/blob/master/package/syslog-ng/syslog-ng.conf:
@version: 3.37
source s_sys {
file("/proc/kmsg" program_override("kernel"));
unix-stream ("/dev/log");
internal();
};
destination d_all {
file("/var/log/messages");
};
log {
source(s_sys);
destination(d_all);
};
请注意,它将目标指定为"/var/log/messages"
,但板上的活动日志记录正在进入一个名为 的文件/var/log/messages.1
,并且该/var/log/messages
文件甚至不存在。这是为什么?有没有办法/var/log/messages
代替登录到文件?
我们过去使用的 Syslog 登录到/var/log/messages
,我们正试图保持这种行为以保持一致性。
补充说明
ls -1 /var/log
在运行的板上syslog
包含以下messages
文件:messages messages.1 messages.2 messages.2.gz messages.3 messages.4 messages.5 messages.6 messages.7
ls -1 /var/log
在运行的板上syslog-ng
包含这些messages
文件(缺少通知messages
):messages.1 messages.2 messages.3 messages.4 messages.5 messages.6 messages.7
- 在
syslog-ng
板上,tail -f /var/log/messages.1
显示它不断接收记录的消息,这是出乎意料的,因为当使用syslog
“活动”文件时/var/log/messages
。
解决了!您必须在每次日志轮换后强制
syslog-ng
重新打开其目标日志文件所以,我想通了。感谢@Murray Jensen在这里的提示。
每当
logrotate
旋转我的/var/log/messages
文件时,它都会将其重命名为/var/log/messages.1
. 但是,syslog-ng
正在写入它打开的原始文件描述符 (fd) 指向的文件。将文件从/var/log/messages
to重命名/var/log/messages.1
不会更改文件描述符,因此文件描述符 syslog-ng 现在正在写入指向现在名为. 修复方法是简单地强制重新打开其日志文件并在每次日志轮换后获取新的文件描述符,从而使其为新创建的目标日志文件获取新的文件描述符,该文件现在存在于./var/log/messages.1
syslog-ng
/var/log/messages
有 3 种方法可以做到这一点,我在这里写过:https ://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-1270517815
请参阅此处了解我了解的地方
syslog-ng-ctl reopen
,这是推荐的方式:https ://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-3466242523种方式是:
因此,要强制
logrotate
在每次日志轮换后自动调用上述 3 种方式之一,您必须将正确的命令作为postrotate
脚本添加到您的/etc/logrotate.d/syslog-ng
(或类似的——可以命名为任何内容)logrotate
配置文件中。下面是一个固定的 logrotate 配置文件现在的样子:从我这里的笔记:
示例
/etc/logrotate.d/syslog-ng
logrotate配置文件:注意:我还在这里打开了文档更改请求:https ://github.com/syslog-ng/syslog-ng/issues/4166 。现在建议
syslog-ng-ctl reopen
在每次日志轮换后使用,而不是syslog-ng-ctl reload
.旧尝试的答案(我首先尝试的)
在运行的板上
syslog-ng
,我完全刷新了 rootfs(根文件系统)映像,然后重新启动了板,现在我/var/log/messages
再次看到该文件:的部分输出
ls -1 /var/log
:我无法解释。
tail -f /var/log/messages
确实如预期的那样显示进入该文件的活动日志,并tail -f /var/log/messages.1
显示该文件是静态的,没有新消息进入,也如预期的那样。syslog-ng
我可以通过查看以下输出来证明该板确实在运行ps aux | grep syslog
:syslog
...与在板上运行时相同的命令的输出相反:同样,我不确定发生了什么,也不知道为什么。
在两个板上,都
ps aux | grep logrotate
显示logrotate
正在运行。前任:两块板子有相同的
/etc/logrotate.conf
文件,只有syslog-ng
板子有/etc/syslog-ng.conf
文件,里面有问题里的内容。如果我在接下来的几天里发现任何新的东西,我会回来更新这个答案。