我有一个嵌入式设备,它有systemd和rsyslog。journald是本地日志记录的主要机制,rsyslog是远程日志记录的主要机制。rsyslog并不总是在运行,只有在需要调试时才会启动。
一旦启动rsyslog,它只转发从那个时间点发生的事件。我正试图让它转发所有的日志,在日记中,目前。
正确的方法是在$ModLoad imjournal中启用/etc/rsyslog.conf。这将允许rsyslog读取日记的归档文件。
我是在一个嵌入式系统,它没有可用于rsyslog的imjournal模块,并且正在寻找解决办法。
这样的解决方法之一是让日志将所有存档的日志从以前重新发送到正在侦听的套接字(现在是活动的)。
有办法这样做吗?
发布于 2018-11-07 14:12:26
这样的功能在日志中并不是真正可用的。
journald.conf手册页记录了ForwardToSyslog=的这一限制:
如果启用了对syslog的转发,但没有从套接字读取消息,则转发到syslog没有任何效果。
这就是为什么来自早期引导的消息丢失的原因。手册页还指出:
使用日记帐,不需要立即读取消息,这允许在引导后期才启动的日志守护进程访问系统启动以来的所有消息。
这就是为什么推荐使用这样一种方法。
我想,当rsyslog第一次启动时,可以使用journalctl来读取它们,使用logger将它们喂给rsyslog,这样就可以在启动时将存储在日志中的消息输入到日志中。也许像这样简单的东西可以起作用:
journalctl -b | logger -u /run/systemd/journal/syslog虽然logger可能会尝试向消息中添加日期和标记,但最终的效果可能与转发的消息不同.也许您可能需要一些比logger更原始或更低级别的内容,或者可能需要重新格式化journalctl输出,以便以rsyslog可以理解的格式.
这个解决方案有一个竞争条件,因为它很可能在这个初始提要和日志转发之间丢失(或复制)一些消息。
获得日志工作绝对是一个更好的解决方案。我很好奇为什么不能提供它,在所有的systemd和rsyslog软件都是为您的设备编译和构建之后,所以至少在技术上也有可能构建imjournal模式.可能涉及到一些交叉编译,这可能会给链接到systemd库带来挑战,但我确信这是一个可以解决的问题,因此也许可以考虑问一个问题,以使其正常工作。
另一个可能的解决方案是使用本机日志远程协议(而不是syslog协议和守护进程)来集中日志。
您可以在远程主机上以“接收器”模式运行系统d-日志-远程,以接收来自嵌入式设备的条目,并将它们保存在本地。和系统d-日志-上载,您可以在嵌入式设备上运行它,将日志数据推送到远程主机。
这既应保留消息从早期启动,也保留所有元数据,因为消息不必转换为syslog格式。它还具有不需要在嵌入式设备上保持本地运行的rsyslog守护进程的优点。
(日志还支持“拉”模型,您可以在嵌入式设备上运行系统-日志-网关%d,并将systemd-日志-remote配置为从它中提取。)
https://unix.stackexchange.com/questions/480361
复制相似问题