DMESG -打印级别

要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来

 

Linux命令:dmesg  功能说明:显示开机信息。

 

  语 法:dmesg[-cn][-s <缓冲区大小>]

 

  补充说明:kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。

 

  参 数:

 

  -c 显示信息後,清除ring buffer中的内容。

 

  -s<缓冲区大小> 预设置为8196,刚好等于ring buffer的大小。

 

  -n 设置记录信息的层级。

 

printk() 使用说明

内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如printk("<6>Hello, world! ");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。

 

#define KERN_EMERG      "<0>"    /* system is unusable */ 

#define KERN_ALERT      "<1>"    /* action must be taken immediately */ 

#define KERN_CRIT       "<2>"    /* critical conditions */ 

#define KERN_ERR        "<3>"    /* error conditions */ 

#define KERN_WARNING    "<4>"    /* warning conditions */ 

#define KERN_NOTICE     "<5>"    /* normal but significant */ 

#define KERN_INFO       "<6>"    /* informational */ 

#define KERN_DEBUG      "<7>"    /* debug-level messages */

#define KERN_EMERG      "<0>"    /* system is unusable */

#define KERN_ALERT      "<1>"    /* action must be taken immediately */

#define KERN_CRIT       "<2>"    /* critical conditions */

#define KERN_ERR        "<3>"    /* error conditions */

#define KERN_WARNING    "<4>"    /* warning conditions */

#define KERN_NOTICE     "<5>"    /* normal but significant */

#define KERN_INFO       "<6>"    /* informational */

#define KERN_DEBUG      "<7>"    /* debug-level messages */

 

 

所以 printk() 可以这样用:printk(KERN_INFO "Hello,world! ");。

 

未指定日志级别的printk() 采用的默认级别是DEFAULT_MESSAGE_LOGLEVEL,这个宏在 kernel/printk.c 中被定义为整数 4,即对应KERN_WARNING。

 

在/proc/sys/kernel/printk 会显示4个数值(可由 echo 修改),分别表示当前控制台日志级别、未明确指定日志级别的默认消息日志级别、最小(最高)允许设置的控制台日志级别、引导时默认的日志级别。当 printk() 中的消息日志级别小于当前控制台日志级别时,printk 的信息(要有符)就会在控制台上显示。但无论当前控制台日志级别是何值,通过 /proc/kmsg (或使用dmesg)总能查看。另外如果配置好并运行了 syslogd 或 klogd,没有在控制台上显示的printk 的信息也会追加到/var/log/messages.log 中。

 

通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。查看这个文件的方法如下:

 

 

#cat /proc/sys/kernel/printk

6  4  1   7

 

 

 

上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。

 

可用下面的命令设置当前日志级别:

# echo 8 > /proc/sys/kernel/printk

### Linux `printk` 打印级别的设置方法 #### 1. 修改 `/proc/sys/kernel/printk` 可以通过修改文件 `/proc/sys/kernel/printk` 来动态调整当前内核的打印级别。该文件存储了一个由四个数值组成的列表,其中第一个值表示当前控制台的日志级别。 命令如下: ```bash echo <level> > /proc/sys/kernel/printk ``` 这里的 `<level>` 是一个介于 0 到 7 的整数,具体含义见表[^2]。 | 日志级别 | 数字值 | 描述 | |----------|--------|--------------------------------------| | EMERG | 0 | 系统不可用 | | ALERT | 1 | 必须立即采取行动 | | CRIT | 2 | 关键条件 | | ERR | 3 | 错误条件 | | WARNING | 4 | 警告条件 | | NOTICE | 5 | 正常但重要的情况 | | INFO | 6 | 信息性消息 | | DEBUG | 7 | 调试级消息 | 例如,将日志级别设为 4(警告及以上消息才会显示到控制台): ```bash echo 4 > /proc/sys/kernel/printk ``` 此操作会即时生效,无需重启系统[^1]。 --- #### 2. 编译时设定默认日志级别 如果希望永久更改内核的默认日志级别,则可以在编译内核时通过菜单配置完成。进入内核源码目录并执行以下命令启动配置界面: ```bash make menuconfig ``` 导航至路径 **Kernel hacking → printk and dmesg options → Default message log level (1-7)** 并选择所需的默认日志级别。保存后重新编译并加载新内核即可应用更改[^3]。 --- #### 3. 在代码中指定 `printk` 消息级别 当编写驱动程序或其他内核模块时,可以直接在调用 `printk` 函数时指定消息级别。语法形式为: ```c printk(KERN_<LEVEL> "message\n"); ``` 例如: ```c printk(KERN_INFO "This is an informational message.\n"); ``` 这里 `KERN_<LEVEL>` 宏定义对应不同的日志级别,如 `KERN_ERR`, `KERN_WARNING`, 或者 `KERN_DEBUG` 等。这些宏位于头文件 `<linux/kern_levels.h>` 中。 --- #### 4. 使用 `dmesg` 控制输出行为 除了调整内核本身的日志级别外,还可以利用工具 `dmesg` 查看或过滤特定级别的日志消息。例如只查看错误和更高级别的消息: ```bash dmesg --level=err,warn,alert,crit,emerg ``` 或者清除环形缓冲区中的现有日志记录以便专注于最新事件: ```bash dmesg -C ``` --- ### 总结 以上介绍了三种方式来管理 `printk` 的打印级别:一是通过写入 `/proc/sys/kernel/printk` 动态改变;二是借助内核编译选项固定初始状态;三是在开发阶段显式标注每条日志的消息优先级[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值