编辑2016-06-02
如果您通常要查找“ Upstart日志消息”,请选中/var/log/upstart/
。那就是Upstart保存stdout
和stderr
Upstart服务的地方。感谢leopd的回答指出了这一点。
如果你正在寻找从新贵本身的日志消息,由配置initctl log-priority
和所发射initctl emit
,阅读!
简洁版本
日志条目实际上应显示在dmesg中。尽管如此,它们默认不会显示在中/var/log
。
如果您也想要它们/var/log
,请添加$KLogPermitNonKernelFacility on
到rsyslogd的配置中。我建议创建一个自定义文件,例如/etc/rsyslog.d/60-custom.conf
避免编辑/etc/rsyslog.conf
,因为它是由dpkg管理的。现在/var/log/syslog
,只要将Upstart设置log-priority
为info
左右,Upstart消息就会显示在中。
长版
这花了我几天时间追查,但显然新贵(1.5)并没有记录到系统日志,也就是说,它不会调用glibc的功能syslog()
。相反,Upstart将日志记录到dmesg读取的内核环形缓冲区。现在,我认为用户空间进程不可能写入该缓冲区,但是显然可以通过写入来实现/dev/kmsg
,而这正是Upstart所做的。这就是难题的第一部分。
第二部分是人们普遍认为,写入内核环形缓冲区的消息会被内核自动复制到syslog中(至少我一直以为如此)。事实证明,这实际上是由用户空间守护程序(通常为klogd)完成的,该守护程序与syslogd协同工作。显然rsyslogd替换了syslogd,但显然它也替换了klogd(排序:请参阅最后的说明)。
第三部分是从用户空间写入内核环形缓冲区的消息实际上看起来与从内核空间写入的消息不同:它们具有不同的功能。dmesg的有几个选项,这个交互:-x
将显示设备(和优先级),而-u
并-k
告诉dmesg的仅分别显示用户设备信息和内核设施的消息。
现在是关键所在:默认情况下,rsyslogd 从内核环形缓冲区读取消息时会忽略具有非内核功能的消息。相关的config选项是$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
与所描述的glibc函数完全不同syslog()
在man 3 syslog
。glibc的实际上提供了一个包装系统调用syslog()
,叫klogctl()
,以帮助缓解这种混乱。
传统上,klogd
从这些接口之一读取数据,然后调用glibc函数syslog()
将其复制到syslog。rsyslogd通过其imklog
输入模块读取这些接口之一,但是AFAIK不会打扰调用glibc syslog()
,这就是为什么它与klogd不完全相同的原因。它只处理输出,imklog
就像处理任何其他输入模块的输出一样。还要增加一个警告,即所有imklog
输出都具有kern
设施,而与内核环形缓冲区中的设施消息无关。
参考文献
dmesg
但是如果没有这里给出的上下文,它就没有任何意义。