syslog

本文深入探讨了Linux内核日志机制,从Printk函数的使用、日志级别、实现原理,到Syslog系统调用及其实现细节,再到/proc/kmsg和Syslog隔离方案,全面解析了内核日志的产生、存储与读取过程。
摘要由CSDN通过智能技术生成

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>

</
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值