在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上似乎也遇到了同样的问题,这是服务器故障的一个问题,这里和这里的更多问题可能也描述了同样的问题。不幸的是,这些问题没有提供解决问题的线索。
如果您通常要查找“ Upstart日志消息”,请选中/var/log/upstart/
。那就是Upstart保存stdout
和stderr
Upstart服务的地方。感谢leopd的回答指出了这一点。
如果您正在寻找Upstart本身提供的日志消息,请继续阅读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
设施,而与内核环形缓冲区中的设施消息无关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句