linux内核⽇志打印:printk和dmesg的⽤法
⽤于检测和控制内核环缓冲。程序⽤来助⽤户了解系统的启动信息
Linux命令dmesg⽤来显⽰开机信息,kernel会将开机信息存储在ring buffer中
开机信息保存在/var/log⽬录中名称为dmesg的⽂件⾥
dmesg [ -c ] [ -n 级别 ] [ -s 缓冲区⼤⼩ ]
1
-c
清除环缓冲内的内容
-s 缓冲区⼤⼩
linux内核文件放在哪定义⼀个⼤⼩为”缓冲区⼤⼩”的缓冲区⽤于查询内核环缓冲区。默认⼤⼩为 8196(此⼤⼩与 2.0.33 和 2.1.103 内核的默认syslog 缓冲区⼤⼩⼀致),如果你设置了⼀个⼤于默认值的环缓冲区,那你就可以⽤这个选项定义⼀个相当的缓冲区来查看完整的环缓冲区内容
-n级别
设置级别为记录控制台启动信息的级别。⽐如,-n 1指的就是将此级别设为最低级,除了内核恐慌信息之外不会向控制台显⽰信息。所有级别的启动信息还将记录到/proc/kmsg,⽂件中,因此,syslogd(8)同样可以⽤来对信息的输出进⾏控制。当使⽤-n选项时,dmesg将不会清除内核环缓冲区中的内容。当同时使⽤以上两个选项时,只有最后⼀个选项才会产⽣效果。
要将linux内核的带级别控制的printk内容打印出来,在命令⾏ 输⼊ dmesg -n 8 就将所有级别的信息都打印出来
printk() 使⽤说明
内核通过 printk() 输出的信息具有⽇志级别,⽇志级别是通过在 printk() 输出的字符串前加⼀个带尖括号的整数来控制的,如 printk("
<6>Hello, world!/n");。内核中共提供了⼋种不同的⽇志级别,在 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!/n");。
未指定⽇志级别的 printk() 采⽤的默认级别是 DEFAULT_MESSAGE_LOGLEVEL,这个宏在 kernel/printk.c 中被定义为整数 4,即对应KERN_WARNING。
在 /proc/sys/kernel/printk 会显⽰4个数值(可由 echo 修改),分别表⽰当前控制台⽇志级别、未明确指定⽇志级别的默认消息⽇志级别、最⼩(最⾼)允许设置的控制台⽇志级别、引导时默认的⽇志级别。当 printk() 中的消息⽇志级别⼩于当前控制台⽇志级别时,printk 的信息(要有/n符)就会在控制台上显⽰。但⽆论当前控制台⽇志级别是何值,通过 /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
另外为了防⽌ printk() 瞬时被调⽤次数过多,可以通过 printk_ratelimit() 来控制速度。printk_ratelimit() 通过跟踪发送到控制台的消息数量⼯作,当输出速度超过⼀个临界值,就返回零。可通过修改 /proc/sys/kernel/{printk_ratelimit, printk_ratelimit_burst} 来调节printk_ratelimit() 的计算。
printk_ratelimit() 的典型⽤法如下:
if (printk_ratelimit())
printk(KERN_INFO "Hello, world!/n");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论