linux printk函数学习

时间:2021-11-30 23:10:26

printk与printf的区别在于:
printk运行在kernel space,而printf运行在user space。
所以kernel打印log使用printk,而应用程序打印log使用printf。

在printk.h中定义了8个级别的log level,
#define KERN_EMERG "<0>"
#define KERN_ALERT "<1>"
#define KERN_CRIT "<2>"
#define KERN_ERR "<3>"
#define KERN_WARNING "<4>"
#define KERN_NOTICE "<5>"
#define KERN_INFO "<6>"
#define KERN_DEBUG "<7>"

通过如下命令,可以查看系统当前设定的printk log level。
从结果中我们看到,系统当前设定的log level为0,所以不会
打印任何log到console上。
sh-# cat /proc/sys/kernel/printk
0       4       1       7

此时要查看系统打印的log的话,有两种方法:
1. 使用dmesg命令将ring buffer中的内容保存起来;
sh-# dmesg > /tmp_fs/dmesg.txt
2. 将/proc/kmsg里面的内容保存起来
sh-# cat /proc/kmsg > /tmp_fs/dmesg.txt
有了上面这两种办法,再也不会因为一不小心没有保存控制台上的log而烦恼了。

那printk level应该如何设定呢?这里有两种办法:
1. 使用dmesg命令进行设定,
sh-# cat /proc/sys/kernel/printk
0       4       1       7
sh-# dmesg -n 7
sh-# cat /proc/sys/kernel/printk
7       4       1       7
2. 直接更改printk配置文件,
sh-# echo 1 > /proc/sys/kernel/printk
sh-# cat /proc/sys/kernel/printk
1       4       1       7

因为linux系统过程中会打印较多的系统log,所以一定要在系统启动前就设定好printk level。

刚通过实验验证了,printk level只会影响到kernel log是否输出到控制台上;
但是无论printk level如何,kernel log都会保存到ring buffer中。

问题:
将printk level设定为KERN_DEBUG,这样开机过程中会输出大量的log,
会不会影响到系统开机性能呢?
需要通过实验进行验证。