我们可以将许多参数传递给 printk:
printk (KERN_INFO "blahahaha");
printk (KERN_EMERG "bababa");
等等。这些标签是否与 syslog.conf 中的设施级别有关?KERN_EMERG 会打印到“kern.emerg”指定的设施吗?这两个实体是如何联系在一起的?
谢谢
我们可以将许多参数传递给 printk:
printk (KERN_INFO "blahahaha");
printk (KERN_EMERG "bababa");
等等。这些标签是否与 syslog.conf 中的设施级别有关?KERN_EMERG 会打印到“kern.emerg”指定的设施吗?这两个实体是如何联系在一起的?
谢谢
按问题顺序:
这些标签与在 中找到的设施级别有什么关系
syslog.conf
吗?
是的。标签实际上是一对,KERN
EMERG
即KERN
设施和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
将其转发到syslogd
。Syslogd
将此数据记录到syslogd.conf
文件指定的目的地。