内核模块日志通过printk输出至环形缓冲区,需用dmesg或journalctl配合grep过滤模块名(如mydrv)来查看;默认控制台可能不显示低级别消息,可调高printk阈值。

内核模块的日志主要通过 printk 输出,统一进入内核环形缓冲区(ring buffer),不写入普通文件系统。要查看指定模块的日志,关键在于过滤出该模块输出的 printk 消息,而不是找某个专属日志文件。
确认模块已加载并产生 printk 输出
先确保你的模块已成功加载,并在代码中使用了带标识的 printk,例如:
printk(KERN_INFO "mydrv: device initialized\n");
printk(KERN_ERR "mydrv: failed to alloc memory\n");
模块名(如 mydrv)作为关键字出现在消息中,是后续过滤的基础。没有显式标识,就很难区分日志来源。
用 dmesg 实时过滤模块日志
dmesg 是查看内核环形缓冲区最直接的命令。配合 -w(实时跟踪)和 grep 可聚焦目标模块:
-
dmesg -w | grep mydrv—— 持续监听新日志并筛选含mydrv的行 -
dmesg | grep -i "mydrv\|error\|warn"—— 查看历史日志,同时匹配模块名和错误/警告关键词 -
dmesg -T | grep mydrv—— 加-T显示本地时间戳,便于定位事件发生时刻
从 /var/log/kern.log 或 journalctl 中提取
如果系统启用了 rsyslog 或 systemd-journald,内核消息通常会被转发到持久化日志:
- Debian/Ubuntu 系统:
grep mydrv /var/log/kern.log - RHEL/CentOS 系统:
grep mydrv /var/log/messages - 所有 systemd 系统:
journalctl -k | grep mydrv(-k专指内核日志) - 更精准方式:
journalctl -k -g "mydrv"(-g支持正则,比管道 grep 更可靠)
调整 printk 日志级别以捕获更多细节
默认控制台可能只显示 KERN_WARNING 及以上级别消息。若模块使用 KERN_INFO 或 KERN_DEBUG 却看不到,需临时提升可见级别:
- 查看当前控制台级别:
cat /proc/sys/kernel/printk(输出如4 4 1 7,第一个数字是控制台日志阈值) - 临时设为显示全部(0=最高优先级,7=最低):
sudo dmesg -n 8 - 注意:这仅影响控制台输出,
dmesg和日志文件仍可查到所有级别消息


















