1

我们可以将许多参数传递给 printk:

 printk (KERN_INFO  "blahahaha");
 printk (KERN_EMERG "bababa");

等等。这些标签是否与 syslog.conf 中的设施级别有关?KERN_EMERG 会打印到“kern.emerg”指定的设施吗?这两个实体是如何联系在一起的?

谢谢

4

1 回答 1

2

按问题顺序:

这些标签与在 中找到的设施级别有什么关系syslog.conf吗?

是的。标签实际上是一对,KERN EMERGKERN设施和EMERG级别——它们是大写的,因为它是一个预处理器宏,按照惯例,它是用大写的。Linux 内核只关心KERN设施,因此没有定义其他设施。

发生的情况是所有这些printk命令都记录到内部内核环形缓冲区。根据您的内核设置,此消息可能会或可能不会复制到控制台(可能是屏幕或串行终端)。

KERN_EMERG 会打印到“kern.emerg”指定的设施吗?

假设您的意思是登录到匹配的文件kern.emerg,那么是的。syslog.conf与此匹配的条目示例是kern.*, kern.emerg, *.emerg。该级别的消息emerg被认为是致命的,即发生了非常糟糕的事情。

来自该级别内核的消息可能不会最终出现在 syslog 文件中,因为该错误可能会阻止将数据写入硬盘驱动器。

这两个实体是如何联系在一起的?

有一个辅助守护程序,通常称为klogd. 它从内核中的环形缓冲区获取输出,默认情况下将它们传递到syslogd其中,根据syslog.conf文件记录它们。

总而言之

printk将消息放入ring buffer. 被ring buffer读取,klogd将其转发到syslogdSyslogd将此数据记录到syslogd.conf文件指定的目的地。

于 2012-10-25T21:20:54.287 回答