内核日志存储在一个内核环形缓存区,内核日志有8个等级:
0 | KERN_EMERG |
1 | KERN_ALERT |
2 | KERN_CRIT |
3 | KERN_ERR |
4 | KERN_WARNING |
5 | KERN_NOTICE |
6 | KERN_INFO |
7 | KERN_DEBUG |
注意不管内核日志等级是多少,日志都会写入环形缓存,只是高于console_loglevel的内核日志不显示而已。
# 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
dmesg本身是通过syslog系统调用去设置的。
# dmesg -n 1
/proc/kmsg提供一个root用户的,只读的接口,来消耗内核日志,等价于 syslog(SYSLOG_ACTION_READ)系统调用,只有一个进程能读取/proc/kmsg。
syslogd等记录内核日志的进程通过读取这个文件来实时获得内核日志。
读取内核日志环形缓存,多个进程可以同时读,读完不会消耗日志,还可以再次读。
dmesg命令读取这个文件来显示当前的内核日志。
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