2. dmesg日志格式深度解析:时间戳、日志级别、设施与动作

dmesg 输出的每一行日志都遵循一套固定的格式规范。理解这些字段的含义,是快速定位内核问题的基本功。本章将逐一拆解时间戳、日志级别(KERN_*)、设施(Facility)和动作(Action)四个核心要素。

核心认知: 一条完整的 dmesg 日志行 = [时间戳] <级别> [设施.动作] 消息正文。掌握这个结构,你就能像读“病历”一样读懂内核的每一次“发言”。
dmesg 日志行结构解剖 [ 5.123456] <3> [kern.warn] (printk) ttyS0: detected caps 00000000 should be 00000100 时间戳 日志级别 设施.动作 消息正文 说明:时间戳表示系统启动后的秒数;级别决定消息的紧急程度;设施标识消息来源子系统;动作描述具体事件。

2.1 时间戳:系统启动后的“心跳”刻度

dmesg 默认使用 相对时间戳,表示从内核启动开始到日志输出时刻所经过的秒数(精确到微秒)。格式为 [ 5.123456],方括号内第一个数字是秒,小数点后是微秒。

时间戳示例 含义 典型场景
[ 0.000000] 内核刚解压完成,初始化开始 早期引导、CPU/内存探测
[ 1.234567] 系统启动后约1.23秒 PCI设备枚举、驱动加载
[ 30.000000] 系统启动后30秒 文件系统挂载、服务启动
[ 1234.567890] 系统已运行约20分钟 运行时错误、硬件中断、OOM
实用技巧: 使用 dmesg -T 可将相对时间戳转换为人类可读的绝对时间(如 Mon Jan 15 10:30:45 2024),便于与系统日志 /var/log/messages 或 journalctl 进行关联分析。
时间戳转换与关联 [ 1234.567890] dmesg -T 转换命令 Jan 15 10:30:45 说明:相对时间戳用于分析启动阶段性能;绝对时间戳用于与应用程序日志交叉比对。

2.2 日志级别:从“致命”到“调试”的八级阶梯

Linux 内核定义了 8 个日志级别,用 <0> 到 <7> 的数字表示,数字越小越紧急。这些级别对应宏定义 KERN_EMERG 到 KERN_DEBUG。

级别编号 宏定义 含义 典型消息示例
<0> KERN_EMERG 系统不可用 Kernel panic - not syncing
<1> KERN_ALERT 必须立即处理 BUG: unable to handle kernel NULL pointer dereference
<2> KERN_CRIT 严重条件 Out of memory: killed process (java)
<3> KERN_ERR 错误条件 ata1.00: failed command: READ DMA
<4> KERN_WARNING 警告条件 ttyS0: detected caps 00000000 should be 00000100
<5> KERN_NOTICE 正常但重要 EXT4-fs (sda1): mounted filesystem with ordered data mode
<6> KERN_INFO 信息性消息 CPU0: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
<7> KERN_DEBUG 调试消息 pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
故障排查要点: 关注 <0> 到 <3> 级别的日志,它们通常直接指向问题根因。<4> 和 <5> 提供上下文线索,<6> 和 <7> 在常规运维中可忽略,但在调试驱动或内核模块时不可或缺。
日志级别紧急程度阶梯 7 KERN_DEBUG 6 KERN_INFO 5 KERN_NOTICE 4 KERN_WARNING 3 KERN_ERR 2 KERN_CRIT 1 KERN_ALERT 0 KERN_EMERG 低 高

2.3 设施(Facility):日志的“部门”归属

设施字段标识日志消息来自内核的哪个子系统。在 dmesg 输出中,设施通常以 [facility.action] 的形式出现,例如 [kern.warn]、[pci]、[ext4]。设施是内核日志系统(printk)与用户态日志系统(syslog)之间的桥梁。

设施代码 设施名称 来源子系统 常见动作示例
0 kern 内核核心 warn, err, info, emerg
1 user 用户态进程 notice, err
2 mail 邮件系统 info, warn
3 daemon 系统守护进程 info, err
4 auth 安全/认证 warn, info
5 syslog syslogd 内部 info, warn
6 lpr 打印系统 info
7 news 网络新闻 info
8 uucp UUCP 子系统 info
9 cron 计划任务 info, warn
10 authpriv 安全/认证(私有) warn, info
11 ftp FTP 守护进程 info
16-23 local0-local7 本地自定义 由应用定义
实战关联: 在 dmesg 中,设施字段帮助你将日志快速归类。例如,看到 [pci] 开头的消息,立即知道是 PCI 子系统的问题;看到 [ext4] 则指向文件系统。结合 grep 命令可以高效过滤:dmesg | grep '\[pci\]'。
设施分类树 内核设施 kern (内核核心) user (用户态) daemon (守护进程) auth (安全认证) 说明:设施代码 0-15 为系统保留,16-23 (local0-local7) 供应用程序自定义使用。 dmesg 中最常见的是 kern 设施,其他设施更多出现在 syslog 中。

2.4 动作(Action):日志的“动词”

动作字段描述设施执行的具体操作或发生的事件。它通常紧跟在设施之后,用点号分隔,如 [kern.warn] 中的 warn。动作是日志语义的核心,告诉你“发生了什么”。

常见的动作包括:

  • err / warn / info / emerg:与日志级别对应的通用动作,表示错误、警告、信息、紧急。
  • probe / init / exit:驱动或模块的探测、初始化、卸载。
  • mount / umount:文件系统的挂载与卸载。
  • alloc / free:内存分配与释放。
  • read / write / ioctl:设备 I/O 操作。
  • timeout / reset:超时或复位事件。
快速过滤技巧: 使用 dmesg | grep '\[.*\.err\]' 可以提取所有设施的错误动作;使用 dmesg | grep '\[pci.*\]' 提取 PCI 子系统的所有动作。动作字段让日志过滤更加精准。
设施.动作 组合示例 [kern.err] NULL pointer [pci.warn] MCFG region [ext4.mount] sda1 [ata.probe] SATA link up 说明:动作字段让日志语义一目了然。err=错误,warn=警告,mount=挂载,probe=探测。

2.5 综合实战:解析一条真实 dmesg 日志

让我们将本章所学知识应用到一条真实的 dmesg 日志行中:

[    5.123456] <3> [kern.warn]  (printk)  ttyS0:  detected caps 00000000 should be 00000100

逐字段解析:

  1. 时间戳:[ 5.123456] — 系统启动后约 5.12 秒。
  2. 日志级别:<3> — KERN_ERR,表示错误条件。
  3. 设施:kern — 来自内核核心子系统。
  4. 动作:warn — 警告动作,但级别是 ERR,说明这是一个被归类为错误的警告。
  5. 消息正文:ttyS0: detected caps 00000000 should be 00000100 — 串口 ttyS0 检测到能力位异常。
故障排查启示: 这条日志表明串口驱动在初始化时发现硬件能力寄存器与预期不符。虽然级别是 ERR,但动作是 warn,说明内核尝试继续运行。运维人员应检查串口硬件或 BIOS 设置,确认串口功能是否正常。