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