3、核心日志文件详解:/var/log/messages、/var/log/syslog、/var/log/boot.log、/var/log/dmesg 的用途与区别

日志文件是系统状态的「黑匣子」。很多运维新手一上来就 tail -f /var/log/messages,以为这就是全部。其实这四个文件各有各的脾气,用错了地方,排查问题能多花一倍时间。

我个人习惯是:先看 dmesg 确认硬件有没有报错,再看 boot.log 检查服务启动顺序,最后才去翻 messages 或 syslog 找应用层面的线索。顺序对了,效率就上来了。

一句话总结:

  • dmesg → 内核环缓冲区,硬件与驱动
  • boot.log → 系统启动时服务的启停记录
  • messages → 通用系统日志(Red Hat 系)
  • syslog → 通用系统日志(Debian 系)
Linux 核心日志文件关系图 Linux 内核 dmesg boot.log messages / syslog 各文件职责说明: • dmesg:内核环缓冲区,记录硬件检测、驱动加载、设备状态 • boot.log:系统启动时 systemd 或 init 脚本的启停日志 • messages/syslog:用户态服务、守护进程、cron 等通用日志 • 箭头方向:数据从内核流向各日志文件

3.1 /var/log/dmesg:内核的「第一手现场」

dmesg 不是文件,而是内核环缓冲区的一个接口。系统一开机,内核就把硬件检测、驱动加载、设备中断这些信息往里面写。说白了,它是系统启动最早的日志来源。

我记得有一次线上服务器网卡间歇性丢包,查了三天应用层代码都没结果。最后用 dmesg -T | grep -i error 一看,发现网卡驱动在启动时报了一个 firmware missing 的警告。嗯,问题出在固件版本不匹配,跟应用代码半毛钱关系没有。

实用技巧:

  • 用 dmesg -T 把时间戳转成人类可读格式
  • 用 dmesg -l err,warn 只过滤错误和警告级别
  • 用 dmesg --level=err 只看错误(新版支持)
# 查看最近 20 条内核消息
dmesg | tail -20

# 带时间戳查看硬件相关消息
dmesg -T | grep -i "usb\|pci\|eth"

# 只看错误级别
dmesg -l err

注意: dmesg 缓冲区大小有限,旧消息会被新消息覆盖。如果系统已经运行了很久,早期的启动信息可能已经丢失。我建议在系统刚启动时就执行 dmesg > /var/log/dmesg.boot 保存一份快照。

3.2 /var/log/boot.log:服务的「点名册」

这个文件记录的是系统启动过程中,各个服务(systemd unit 或 init 脚本)的启停状态。说白了,就是「谁起来了,谁没起来」。

我曾经接手过一台老旧的 CentOS 6 服务器,每次重启后 Nginx 都起不来,但手动 service nginx start 又正常。查了 /var/log/boot.log 才发现,Nginx 启动时依赖的网络服务还没完全就绪,导致启动顺序错乱。加了个 sleep 5 的启动延迟就解决了——虽然粗暴,但管用。

# 查看启动日志
cat /var/log/boot.log

# 在 systemd 系统上,更推荐用 journalctl
journalctl -b | grep -i "failed\|error"

关键点:

  • 传统 SysV 系统:/var/log/boot.log 记录所有 init 脚本输出
  • 现代 systemd 系统:journalctl -b 替代了大部分 boot.log 功能
  • 如果 boot.log 为空,说明系统已经切换到 systemd 的 journal 模式

3.3 /var/log/messages 与 /var/log/syslog:通用日志的「双胞胎」

这两个文件功能几乎一样,区别只在于发行版家族:

特性 /var/log/messages /var/log/syslog
所属发行版 Red Hat / CentOS / Fedora Debian / Ubuntu / Mint
记录内容 内核日志 + 用户态服务 + 认证信息 内核日志 + 用户态服务 + 认证信息
日志轮转 logrotate 按周轮转,保留 4 周 logrotate 按周轮转,保留 4 周
典型路径 /var/log/messages /var/log/syslog
现代替代 journalctl journalctl

说白了,你在一台 CentOS 上习惯看 messages,换到 Ubuntu 上就得看 syslog。内容格式几乎一模一样,就是文件名不同。

我个人习惯是:不管什么发行版,先 ls /var/log/ | grep -E 'messages|syslog' 看一眼,哪个存在就看哪个。省得记混。

快速定位问题的方法:

  1. 先确定时间窗口:grep "2025-03-20 14:" /var/log/messages
  2. 再过滤关键字:grep -i "error\|fail\|panic"
  3. 最后看上下文:grep -B 5 -A 10 "关键错误信息"
# 查看最近 50 条系统日志
tail -50 /var/log/messages

# 实时监控新日志
tail -f /var/log/syslog

# 搜索特定服务的日志
grep "sshd" /var/log/messages | tail -20

3.4 四个文件的对比总结

你想想看,这四个文件就像四个不同视角的监控摄像头:

  • dmesg 对着硬件和内核拍特写
  • boot.log 拍的是服务启动的「集体照」
  • messages/syslog 拍的是系统运行的「全景监控」

排查问题时,我建议按这个顺序来:

  1. 先看 dmesg 排除硬件和驱动问题
  2. 再看 boot.log 确认服务启动状态
  3. 最后翻 messages/syslog 找应用层线索

避坑指南: 我曾经在一台 Ubuntu 服务器上找了半天 /var/log/messages,结果发现这个文件根本不存在。Debian 系默认只写 syslog,Red Hat 系才写 messages。如果你在两个发行版之间切换,记得先确认文件名。

另外,现在很多新系统默认用 systemd-journald,传统的 messages 和 syslog 可能只保留部分日志,甚至完全为空。这时候要用 journalctl 来查。不过别担心,日志内容是一样的,只是存储方式从文本文件变成了二进制数据库。

# 用 journalctl 查看本次启动的日志(替代 messages)
journalctl -b

# 查看上次启动的日志(排查重启问题)
journalctl -b -1

# 查看特定服务的日志
journalctl -u nginx.service

嗯,这四个文件搞清楚了,系统日志这块你就掌握了七成。剩下的三成,是 /var/log/secure、/var/log/cron、/var/log/maillog 这些专项日志,后面章节会逐个拆解。