ILD

kernel log
作者:Yuan Jianpeng 邮箱:yuanjianpeng@xiaomi.com
发布时间:2021-6-7 站点:Inside Linux Development

内核日志存储在一个内核环形缓存区,内核日志有8个等级:


KERN_EMERG 
1KERN_ALERT
2KERN_CRIT
3KERN_ERR
4KERN_WARNING
5KERN_NOTICE
6KERN_INFO
7KERN_DEBUG


1 设置内核日志等级

注意不管内核日志等级是多少,日志都会写入环形缓存,只是高于console_loglevel的内核日志不显示而已。


1.1 通过/proc/sys/kernel/printk接口

# cat /proc/sys/kernel/printk

7       4       1       7

第一个值是console_loglevel,当前日志等级。

第二个值是default_message_loglevel,如果一个日志没有指定等级的话,这个日志具有这个值的等级。

第三个值是minimum_console_loglevel,可以设置的最小的日志等级。

第四个值是default_console_loglevel,启动的时候默认的日志等级。


root用户设置:

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


1.2 通过dmesg

dmesg本身是通过syslog系统调用去设置的。


# dmesg -n 1


2 /proc/kmsg

/proc/kmsg提供一个root用户的,只读的接口,来消耗内核日志,等价于 syslog(SYSLOG_ACTION_READ)系统调用,只有一个进程能读取/proc/kmsg。


syslogd等记录内核日志的进程通过读取这个文件来实时获得内核日志。


3 /dev/kmsg

读取内核日志环形缓存,多个进程可以同时读,读完不会消耗日志,还可以再次读。


dmesg命令读取这个文件来显示当前的内核日志。


4 syslog()系统调用

int syslog(int type, char *bufp, int len);


对应的glibc接口

int klogctl(int type, char *bufp, int len);


type指定操作的类型,可以设置日志等级,读取日志等。


参考

https://linuxconfig.org/introduction-to-the-linux-kernel-log-levels

https://unix.stackexchange.com/questions/585919/what-is-the-difference-between-proc-kmsg-and-dev-kmsg


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.