需求:
有时候需要监控应用程序关键动作,因此需要将应用程序的log写入到kernel log的缓冲区去。另外,有时候为了查看应用程序和kernel的时序,需要结合应用程序打印的log和kernel的log来查看前后关系。关于打印输出,https://elinux.org/Debugging_by_printing 做了详细的介绍。
kernel log输出介绍
1、dmesg
命令官方说明的用法是:
dmesg is used to examine or control the kernel ring buffer. The default action is to read all messages from kernel ring buffer.
-n
参数可以设置loglevel,详见:
1 | -n, --console-level level |
在include/linux/kern_levels.h
文件中定义了内核loglevel:
1 | #ifndef __KERN_LEVELS_H__ |
在终端中可以查看当前设置的loglevel:
1 | # cat /proc/sys/kernel/printk |
关于dmesg
的具体实现,可以在androidxref.com中查找或者查看busybox
、toybox
中关于dmesg
命令的实现,最终都是调用klogctl()
函数获取到kernel message。
查看klogctl
函数的帮助文档man klogctl
得到关于这个函数的介绍和用法:
syslog, klogctl - read and/or clear kernel message ring buffer; set console_loglevel
2、cat /proc/kmsg
打印kernel log
1 | The kernel log buffer is accessible for reading from userspace by /proc/kmsg. |
3、/dev/kmsg
设备节点
应用程序可以通过/dev/kmsg
节点将打印信息写入到kernel log中。关于这个节点详见官方的介绍:https://www.kernel.org/doc/Documentation/ABI/testing/dev-kmsg
因此,下面的程序就是将log输出到kernel log中。
1 | #include <stdio.h> |
参考资料
https://github.com/karelzak/util-linux/blob/master/sys-utils/dmesg.c
https://github.com/brgl/busybox/blob/master/util-linux/dmesg.c