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 系)
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' 看一眼,哪个存在就看哪个。省得记混。
快速定位问题的方法:
- 先确定时间窗口:
grep "2025-03-20 14:" /var/log/messages - 再过滤关键字:
grep -i "error\|fail\|panic" - 最后看上下文:
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 拍的是系统运行的「全景监控」
排查问题时,我建议按这个顺序来:
- 先看 dmesg 排除硬件和驱动问题
- 再看 boot.log 确认服务启动状态
- 最后翻 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 这些专项日志,后面章节会逐个拆解。