dmesg -l err,warn可精准筛选内核错误与警告日志,需配合grep过滤硬件关键词,并用-T、-w实现时间定位与实时监控,避免被info/debug信息淹没。

只显示 err 和 warn 级别的驱动/硬件日志
内核日志默认混杂大量 info 和 debug 信息,直接 dmesg 会淹没关键信号。用 -l 参数可硬性过滤级别,但注意:它只控制“输出哪些级别”,不改变内核实际记录的内容。
最常用且有效的组合是:
-
dmesg -l err,warn—— 仅输出错误(err)和警告(warn)两级,跳过 notice、info 等干扰项 - 搭配
--color=always可让err红显、warn黄显,一眼锁定问题行 - 若系统较老(如 CentOS 7 内核 3.10),
-l可能不支持多级逗号分隔,此时改用dmesg -l err或dmesg -l warn单独查
再叠加关键词过滤,精准锚定驱动与硬件异常
光靠级别还不够——err 可能来自文件系统或调度器。必须结合设备上下文缩小范围。典型做法是管道接 grep,但要注意顺序和大小写:
- 先用
dmesg -l err,warn缩减数据量,再grep -i匹配关键词,避免全量日志 grep 耗时 - 必加的硬件/驱动关键词:
firmware、phy、timeout、reset、failed、irq、link down - 网卡驱动名要具体:
e1000e、igb、ixgbe、mlx5_core、r8169,避免漏掉驱动专属错误(如"e1000e: eth0: Failed to load firmware")
为什么不用 dmesg -n 来“限制日志产生”
dmesg -n 是设置内核当前打印级别(即控制台输出阈值),不是过滤已有日志。它影响的是后续新消息是否上 console,对已存在的环形缓冲区内容无效。误用会导致:
-
dmesg -n 3后,你仍能用dmesg -l err,warn看到旧的 warn 日志,但新产生的 notice 级消息不会刷到屏幕——这跟“只看严重告警”的目标无关 - 该操作需 root 权限,且临时生效;重启后还原,容易让人误以为配置“没生效”
- 真正需要的是读取时过滤,不是运行时压制,否则可能错过
notice级里隐藏的线索(比如"mlx5_core: FW version 16.29.1012: new firmware detected")
时间戳 + 滚动监控,避免遗漏瞬态故障
硬件链路震荡(如 link down → link up 频繁切换)常在几秒内发生,纯 dmesg 快照可能刚好错过。必须启用实时跟踪:
-
dmesg -T -l err,warn -w:带可读时间戳(-T)、只输出 err/warn、持续监听(-w) - 配合
grep --line-buffered实现流式过滤,例如:dmesg -T -l err,warn -w | grep --line-buffered -i "phy\|firmware\|timeout" - 注意:
-w不退出,需Ctrl+C中断;生产环境建议重定向到文件并用tail -f查看
真正难的是区分“驱动报错”和“硬件真故障”——同一行 "link down" 可能是网线松动,也可能是 PHY 芯片损坏。必须结合 ethtool -S eth0 看 rx_los、tx_fault 计数器,或 lspci -vv -s 0000:02:00.0 看 AER 错误寄存器。dmesg 只负责发出第一声警报,别让它替你下结论。



















