Syslog
1 内核日志基本框架
内核日志是通过printk函数实现的,它与用户空间对应的函数printf具有同样的作用。
内核创建一个名为_log_buf的Ring Buffer(环型缓冲区)来保存内核中打印的内核日志信息。
而用户态可以通过Syslog相关的系统调用或者/proc文件以及/dev/kmsg设备节点来查看_log_buf的信息,这些操作都是通过do_syslog的系统调用接口来实现的。
内核日志框架
2 Printk
在内核中,printk可以使用和prinf一样的格式将格式化消息输入到缓冲区。
Printk的格式如下:
int printk( const char * fmt, ... );
其中,fmt是一个定义文本和格式的字符串,其后面的参数列表是输出格式中需要输入的可变个数参数。
通过 printk 实现的日志是通过内核配置选项CONFIG_PRINTK激活的。虽然 CONFIG_PRINTK一般都是激活的,但是不包含这个选项的系统对内核的调用会返回一个ENOSYS 错误返回值。
2.1 日志级别
内核允许每一个消息根据日志级别(定义不同消息重要必的八种级别之一)来分类。这些级别可以用来判断系统是否不可用(紧急消息)、是否发现严重状况(严重消息)或者是否为简单报告消息。这个内核代码直接将日志级别定义消息的第一个参数。
例如下面的代码:
printk( KERN_CRIT "Error code %08x.\n", val );
KERN_CRIT只是一个普通的字符串,作为预处理程序的一部分,C会自动地使用一个名为 字符串串联的功能将这两个字符串组合在一起。组合的结果是将日志级别和用户指定的格式字符串包含在一个字符串中。如果调用者未将日志级别提供给printk,那么系统就会使用默认值KERN_WARNING(表示只有KERN_WARNING 级别以上的日志消息会被记录。)
内核的日志级别包括:
标识符 |
字符串 |
使用方法 |
KERN_EMERG |
<0> |
紧急消息(导致系统崩溃) |
KERN_ALERT |
<1> |
必须立即处理的错误 |
KERN_CRIT |
<2> |
严重错误(硬件或软件) |
KERN_ERR |
<3> </ |