Lek*_*eyn 8 logs debugging systemd systemd-journald
自从我在 Arch Linux 上“升级”到 systemd 以来,当发生意外锁定时,我不断丢失日志。一个月前我遇到了同样的日志丢失问题,然后又遇到了这个问题。还有其他独立的确认。
情况:
(顺便说一句,我正在运行 Linux v3.8-rc5-218-ga56e160)
那么,如何确保在由于锁定而异常重启时保留我的日志?
所以我在#systemd IRC 频道上询问,结果表明 journald(systemd 的日志守护进程)根本不会定期将日志刷新到磁盘。这意味着您的日志随时都处于危险之中。
发送SIGUSR2
到journald
导致日志写入磁盘,但如果多次执行此操作,将创建许多文件。(该选项实际上被描述为“日志轮换”)。
最后,我决定采用另一个建议:使用专用的 syslog 守护进程来收集内核日志。由于有人建议使用 rsyslog(而且我已经使用过它),因此我进一步探索了该选项。我在Arch Wiki 中写了一些关于使用 rsyslog 的更多细节。
这个想法是运行 rsyslog,只从内核设施收集数据。由于 rsyslog 读取/proc/kmsg
(仅允许单个读取器)和 journald 读取/dev/kmsg
(允许多个读取器),守护进程不会丢失日志(对我来说非常重要!)。配置 rsyslog 以将内核消息写入文件并确保该文件被轮换以防止占用您的磁盘空间。
这个解决方案并不完美:
grep
单个日志文件或更慢但更高级的journalctl
.有一个TODO 项可以更频繁地刷新日志,但这仍然不够可靠:
日志:不时发送标记消息,然后立即与 fdatasync() 同步,以保证每小时同步。
现在,希望 systemd/journald 可以选择将日志写入磁盘,但同时我们可以结合工具来实现目标。