在 Ubuntu 12.04 上,我可以在 中找到 Upstart 日志消息/var/log/syslog
。
命令:
# initctl log-priority info
# initctl emit hello
日志:
Apr 1 01:56:56 precise64 kernel: [ 8365.820425] init: Connection from private client
Apr 1 01:56:56 precise64 kernel: [ 8365.821130] init: Handling hello event
在 Ubuntu 13.10 上,虽然命令按预期工作,但消息不会出现在目录下syslog
或任何其他地方。我应该在其他地方寻找它们吗?我需要在某处更改配置设置吗?/var/log
logger hello
有一个关于服务器故障的问题来自在 Ubuntu 13.04 上遇到同样问题的人这里和这里也可能描述了同样的问题。不幸的是,这些问题没有提供解决问题的线索。
答案1
编辑 2016-06-02
如果您尝试查找“Upstart 日志消息”,请查看/var/log/upstart/
。这是 Upstart 保存 Upstart 服务的地方stdout
。stderr
感谢 leopd 的回答指出了这一点。
如果您正在寻找 Upstart 本身的日志消息(由 配置initctl log-priority
和发出)initctl emit
,请继续阅读!
简洁版本
日志条目应该会显示在 dmesg 中。尽管如此,它们确实不是默认显示在 中/var/log
。
如果您/var/log
也想将它们添加$KLogPermitNonKernelFacility on
到 rsyslogd 的配置中。我建议创建一个自定义文件,例如,/etc/rsyslog.d/60-custom.conf
以避免编辑,因为它由 dpkg 管理。现在,一旦您将 Upstart 设置为左右/etc/rsyslog.conf
,Upstart 消息应该就会显示在 中。/var/log/syslog
log-priority
info
长版本
我花了好几天才找到原因,但显然 Upstart (1.5) 确实不是记录到 syslog,也就是说,它不调用 glibc 函数syslog()
。相反,Upstart 记录到内核环形缓冲区,这是 dmesg 读取的内容。现在,我不认为这是可能的用户空间进程无法写入该缓冲区,但显然它们可以通过写入来实现/dev/kmsg
,而这正是 Upstart 所做的。所以这是谜题的第一部分。
第二部分是,人们普遍认为写入内核环形缓冲区的消息会被内核自动复制到 syslog(至少我一直这么认为)。事实证明,这实际上是由用户空间守护进程(传统上是 klogd)完成的,它与 syslogd 协同运行。显然 rsyslogd 取代了 syslogd,但显然它也取代了 klogd(有点:请参阅最后的注释)。
第三部分是,从用户空间写入内核环形缓冲区的消息实际上看起来与从内核空间写入的消息不同:它们具有不同的功能。dmesg 有几个与此交互的选项:-x
将显示功能(和优先级),而-u
和-k
告诉 dmesg 分别仅显示用户功能消息和内核功能消息。
现在关键来了:默认情况下,rsyslogd忽略当从内核环形缓冲区读取消息时,rsyslogd 会使用非内核功能处理消息。相关的配置选项是$KLogPermitNonKernelFacility
,默认情况下处于关闭状态,如果您希望 rsyslogd 处理这些消息,则需要将其打开。请注意,rsyslogd 的其余配置将把来自内核环形缓冲区的所有消息视为具有该kern
功能,而不管它们在内核环形缓冲区中具有什么功能。
更多信息
系统日志
代码可以通过调用 glibc 函数 写入 syslog syslog()
,如 中所述man 3 syslog
。显然这些函数写入/dev/log
。代码可以通过读取 来从 syslog 读取/dev/log
,这就是syslogd
及其替代品所做的。使用其输入模块rsyslogd
读取。/dev/log
imuxsock
内核环形缓冲区
内核空间通过调用内核函数 写入此缓冲区printk()
,因此有时将其称为 printk 缓冲区。用户空间可以通过写入 写入/dev/kmsg
此缓冲区。用户空间可以通过多种方法从此缓冲区读取:它可以从 读取/proc/kmsg
(默认情况下 dmesg 执行此操作),也可以从 读取/dev/kmsg
,或者它可以调用系统调用syslog()
,这在 中进行了描述,man 2 syslog
并且是完全不同syslog()
来自中描述的glibc 函数man 3 syslog
。glibc 实际上为系统调用提供了一个包装器syslog()
,称为klogctl()
,以帮助缓解这种混淆。
传统上,klogd
从其中一个接口读取,然后调用 glibc 函数syslog()
将它们复制到 syslog。rsyslogd 通过其imklog
输入模块读取其中一个接口,但据我所知,它不会调用 glibc syslog()
,这就是为什么它与 klogd 不完全相同的原因;它只是处理输出,imklog
就像它处理来自任何其他输入模块的输出一样。还有一个额外的警告,即所有imklog
输出都具有kern
功能,而不管内核环形缓冲区中的功能消息如何。
参考
- http://upstart.ubuntu.com/cookbook/#initctl-log-priority(错误地指出 Upstart 记录到系统日志)
- https://www.kernel.org/doc/Documentation/ABI/testing/dev-kmsg
- http://www.gnu.org/software/libc/manual/html_node/Overview-of-Syslog.html
- http://www.rsyslog.com/doc/v5-stable/configuration/modules/imklog.html(请注意,这是针对 Ubuntu 12.04 中使用的 v5。这些选项在最近的 rsyslog 版本中被视为遗留选项)
答案2
我发现我的/var/log/upstart/