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
紧急消息(导致系统崩溃)
KERN_ALERT
必须立即处理的错误
KERN_CRIT
严重错误(硬件或软件)
KERN_ERR
错误状况(一般出现在驱动程序上)
KER活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看N_WARNING
警告状况(可能导致错误)
KERN_NOTICE
不是错误,但是一个重要状况
KERN_INFO
报告消息
KERN_DEBUG
仅用于调试的消息
KERN_DEFAULT
默认内核日志级别
KERN_CONT
日志行继续(避免增加新的时间截)
2.2??????Printk的实现2.2.1????? 日志缓冲区_log_buf
内核中,printk将日志信息打印到环型缓冲区(Ring Buffer)_log_buf中。
环形缓冲区__log_buf在使用之前就是已定义好的全局变量,缓冲区的长度为1
还没有评论,来说两句吧...