直接查看/proc/sys/kernel/printk第一个数字即当前控制台日志级别,数值越小优先级越高(0为KERN_EMERG),仅决定哪些日志输出到控制台;dmesg始终显示全部缓冲区内容。

怎么看内核日志的当前严重级别(printk)
直接看内核当前控制台日志输出阈值,用 cat /proc/sys/kernel/printk。输出是四个数字,比如 4 4 1 7,第一个数就是当前生效的 console_loglevel:数值越小,级别越高,只允许优先级 ≥ 该值的消息打到控制台。
-
0是KERN_EMERG(系统崩溃级),4是KERN_WARNING(默认常见值) - 这个值不等于“日志里记录了多少”,只影响“哪些会实时刷到终端/控制台”
-
dmesg输出不受它限制,dmesg总是显示全部缓冲区内容(除非被覆盖)
怎么过滤出特定严重级别的内核日志(dmesg -l)
dmesg -l 支持按字符串级别名过滤,比如只看错误和警告:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
dmesg -l err,warn—— 显示err和warn级别(注意不是error或warning) - 可用级别缩写只有:
emerg、alert、crit、err、warn、notice、info、debug - 别写成全称,
dmesg -l error会静默失败,不报错也不输出 - 多个级别用逗号分隔,不能有空格:
dmesg -l emerg,crit✅,dmesg -l emerg, crit❌
怎么查 systemd 日志里某条记录的实际级别(journalctl -o verbose)
systemd 日志每条都带完整元数据,包括原始 PRIORITY 字段(0–7 整数),但默认格式不显示。要确认某条日志的真实严重性:
-
journalctl -n 20 -o verbose | grep -A2 'PRIORITY='—— 查最近20条里的优先级值 -
PRIORITY=3对应err,PRIORITY=4对应warn,以此类推(0 最高) - 也可以用
journalctl -p 3直接按数字级别过滤,-p 3就是只显示err及更高级别(即 0–3) -
journalctl -p warning是合法的,但底层还是转成数字;推荐用数字更稳妥,避免拼写差异
为什么 grep -i error /var/log/messages 不等于看 err 级别日志
文本日志文件(如 /var/log/messages)里写的 “error” 是日志内容里的字符串,不是 syslog 协议定义的严重级别字段。
- 一条
info级别的日志,内容可能含 “failed to connect: error 111” ——grep error会抓到,但它根本不是err级 - 真正
err级的日志,内容可能只写 “device timeout”,没出现 “error” 字样 - 想严格按级别查,必须用
journalctl -p或dmesg -l,而不是靠关键词模糊匹配 - 文本日志本身不存级别码,
rsyslog写入时可能把PRIORITY转成文字前缀(如ERR),但格式不统一,不可靠
dmesg 和 journalctl -k 虽然都读内核 ring buffer,但 journalctl -k 可能因持久化策略丢部分早期消息,而 dmesg 更接近原始缓冲区快照——要看刚发生的硬件异常,优先跑 dmesg -T | tail -30。

















