Ubuntu 13.X上的Upstart日志消息在哪里?


28

在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上遇到了相同的问题,这是服务器故障的一个问题,这里这里的更多问题可能也描述了相同的问题。不幸的是,这些问题没有提供解决问题的线索。

Answers:


39

编辑2016-06-02

如果您通常要查找“ Upstart日志消息”,请选中/var/log/upstart/。那就是Upstart保存stdoutstderrUpstart服务的地方。感谢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-priorityinfo左右,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/logimuxsock

内核环形缓冲区

内核空间通过调用内核函数写入此缓冲区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设施,而与内核环形缓冲区中的设施消息无关。

参考文献


4
感谢您深入解释为什么此方法不起作用以及如何解决。提到的链接问题的答案之一,dmesg但是如果没有这里给出的上下文,它就没有任何意义。
Bradd Szonye 2014年

16

我发现我的 /var/log/upstart/


我在文件/var/log/upstart/job.log中找到了我job的名字。
肯尼·埃维特

AFAIK是作业中输出stdout / stderr的地方。这个问题是关于Upstart本身的日志消息,它与任何特定作业都不相关。
Vanessa Phipps 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.