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

Bra*_*nye 30 upstart logging syslog 13.10

在 Ubuntu 12.04 上,我可以在/var/log/syslog.

命令:

# initctl log-priority info
# initctl emit hello
Run Code Online (Sandbox Code Playgroud)

日志:

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
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 13.10 上,消息不会出现在目录中syslog/var/log目录下的任何其他地方,尽管类似的命令logger hello按预期工作。我应该去别的地方找他们吗?是否有我需要在某处更改的配置设置?

在 Ubuntu 13.04 上似乎有同样问题的人提出了一个关于 Server Fault的问题,更多的herehere也可能描述了同样的问题。不幸的是,这些问题没有提供解决问题的线索。

Van*_*pps 40

编辑 2016-06-02

如果您通常尝试查找“Upstart 日志消息”,请检查/var/log/upstart/. 这就是 Upstart 保存stdoutstderr来自 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 管理的。现在 Upstart 消息应该显示在 中/var/log/syslog,一旦您将 Upstart 设置log-priorityinfo左右。

长版

这花了我几天的时间来追踪,但显然 Upstart (1.5)没有记录到 syslog,也就是说,它没有调用 glibc 函数syslog()。相反,Upstart 将日志记录到内核环形缓冲区,这是 dmesg 读取的内容。现在,我认为用户空间进程不可能写入该缓冲区,但显然他们可以通过写入/dev/kmsg,而这正是 Upstart 所做的。这就是谜题的第一部分。

第二部分是人们普遍认为写入内核环形缓冲区的消息会被内核自动复制到 syslog(至少我一直这么认为)。事实证明,这实际上是由用户空间守护进程完成的,传统上是 klogd,它与 syslogd 协同工作。显然 rsyslogd 取代了 syslogd 但显然它也取代了 klogd(有点:见最后的注释)。

第三部分是从用户空间写入内核环形缓冲区的消息实际上看起来与从内核空间写入的消息不同:它们具有不同的功能。dmesg的有几个选项,这个交互:-x将显示设备(和优先级),而-u-k告诉dmesg的仅分别显示用户设备信息和内核设施的消息。

现在关键在于:默认情况下,rsyslogd在从内核环形缓冲区读取消息时会忽略具有非内核功能的消息。相关的配置选项是$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设施。

参考

  • 感谢您深入解释为什么这不起作用以及如何解决它。链接问题的答案之一提到了“dmesg”,但如果没有此处给出的上下文,它就没有任何意义。 (4认同)

Leo*_*opd 18

我在 /var/log/upstart/