rsyslog
我在 Debian Buster 上使用。
我使用的是旧式sysvinit
,而不是 systemd。rsyslog
在 init 启动序列的后期启动,在大多数 init 脚本运行之后。
引导过程中的消息dmesg
以及在 rsyslog 启动之前运行的其他启动脚本中的其他早期日志消息不会丢失。rsyslog
将在启动时立即记录它们。
当 rsyslog 未运行时,这些消息存储在哪里?
我可以在启动 rsyslog 之前清除此“缓存”,以便不记录早期启动消息吗?
或者,更好的是,我可以将它们过滤掉,以便将它们记录到主系统日志文件中:
*.* -/var/log/syslog
但未登录另一个:
*.* |/dev/xconsole
更新和澄清
我意识到我想要解决的问题可能并不完全清楚。因此,这里对情况进行一些澄清:
除了标准syslog
日志记录(即/var/log/syslog
)之外,我还将相同的信息记录到/dev/xconsole
,并且当我以用户身份登录桌面会话时,我在后台使用以下命令的终端:
cat /dev/xconsole
这样,我可以立即看到新日志出现在我的背景中。此外,与常规文件不同的是,/dev/xconsole
它在读取后会被清空。因此,当我注销并再次登录时,我看不到旧消息,而只看到新消息。
现在的问题是,启动后,内核缓冲区中有太多日志,rsyslog
启动时,它会填满/dev/xconsole
无用的调试早期启动信息的整个容量。
我最感兴趣的是后期启动消息,而这些消息丢失了。只有在我cat
/dev/xconsole
第一次之后,我才会释放空间,并且可以收到新消息。
我添加了这个丑陋的黑客/etc/rsyslog.conf
:
:msg, startswith, "\[ " stop
*.* |/dev/xconsole
这基本上丢弃所有以个位数秒计数器开头的早期消息[ 0.000000]
,但接受所有后续消息,即 [ 14.348189]
这可行,但我认为这是肮脏的解决方法。
那么,我怎样才能摆脱我不感兴趣的早期启动消息,并记录有用的初始化启动脚本消息呢?
答案1
该syslog
流程通常从三个来源获取消息:
- 应用程序,通过
/dev/log
- 通过端口 514 进行网络连接
- 内核,通过
/proc/kmsg
/dev/log
现在,第一个......传统上,在进程启动之前发送的任何应用程序syslogd
都会丢失其消息。 systemd
事情有点混乱,因为它可以改为监听该套接字。然后就syslogd
可以读取了systemd
。但这似乎不是你关心的问题。
第二个显然与你的问题无关。
所以我们重点关注第三个。这些是以 开头的行[...]
,其中数字是启动后的时间戳。这些是由内核而不是用户空间应用程序创建的消息。
内核消息被放入“环形缓冲区”中,rsyslog
启动时它将读取此缓冲区以将数据放入...配置文件所说的放置位置。
在正常情况下,这是好的。您需要所有内核启动消息的日志,以防万一某些内容无法正常启动。
但如果您不关心它们,那么您可以使用该命令dmesg --clear
。这会清除“环形缓冲区”。因此,如果您在启动之前将其放入启动序列中,rsyslog
那么守护进程将不会读取任何内核消息;缓冲区已被清除。
现在如何你所做的这很大程度上取决于你正在运行的发行版。使用传统方式sysvinit
,您可能需要创建一个在 syslog 启动脚本之前运行的 RC 文件。使用 systemd,您可能希望在 syslog 进程上创建一个带有先决条件的单元。
答案2
这个答案可能已经很晚了,OP可能不再需要,但它可能会为其他人服务。
斯蒂芬·哈里斯的答案非常好,但像OP一样,dmesg --clear
似乎对我不起作用。然而,只需在开始之前阅读/proc/kmsg
类似的内容即可完成工作。cat /proc/kmsg > /dev/null
rsyslog
注意:我会回复评论,但我没有所需的声誉。
答案3
清除 dmesg/kmsg 中的消息是一个坏主意,从长远来看可能会给您带来麻烦。您可能不希望在 xconsole 上看到这些消息,但当它们存储在其他日志中时,它们对于调试可能很重要。
这里最好的解决方案可能是在启动过程的早期清除 xconsole,即在 syslog 启动后但在收集其他“后期启动消息”之前的某个时间。
如果您的一些“后期启动消息”被此进程吃掉,那么您可能需要在清理中添加一个解析器,以便它在您想要吃掉的最后一个内核行之后或在您不吃掉的第一个后期阶段行之后停止不想清除。
如果您对此感到满意,您可以通过在 rsyslogd 之后立即优先考虑它或将其添加到 rsyslogd init 脚本中来注入此“xconsole clear”,尽管更改可能会因更新而发生。