3、日志收集工具:dmesg命令详解、journalctl命令详解、/var/log/目录结构
日志这东西,平时你可能觉得它没啥用。但系统一出问题,它就是你的救命稻草。我个人习惯,排查启动故障时,先翻三个地方:dmesg、journalctl、还有 /var/log/ 下的老牌日志文件。今天咱们就把这三个工具彻底聊透。
3.1 dmesg:内核的“实时广播”
dmesg 全称是 "display message",它读取的是内核环缓冲区(kernel ring buffer)里的信息。说白了,就是内核在启动过程中,以及运行期间,不断往外“喊话”的内容。这些内容主要涉及硬件检测、驱动加载、文件系统挂载等底层操作。
基本用法
直接敲 dmesg,你会看到一长串输出。信息太多了,通常需要配合管道过滤:
# 查看所有内核日志
dmesg
# 实时监控内核日志(类似 tail -f)
dmesg -w
# 只看最后20条
dmesg | tail -20
# 按时间戳查看人类可读的时间
dmesg -T
实战过滤技巧
我在项目中遇到过,一台服务器启动后网卡死活不亮。用 dmesg 一查,真相大白:
# 查看与网卡相关的日志
dmesg | grep -i eth
dmesg | grep -i network
# 查看错误和警告
dmesg | grep -i error
dmesg | grep -i fail
# 查看USB设备识别情况
dmesg | grep -i usb
重要提示: dmesg 的缓冲区大小有限。如果系统运行时间很长,早期的启动日志会被新日志覆盖。所以,如果你要排查启动问题,最好在系统刚启动时就查看 dmesg,或者使用 journalctl 来获取持久化的日志。
我的小技巧: 我习惯把 dmesg 输出重定向到文件,方便后续分析:dmesg -T > /tmp/boot_dmesg.log。这样即使缓冲区被覆盖,也有备份可查。
3.2 journalctl:systemd 时代的日志瑞士军刀
现在大多数 Linux 发行版都用 systemd 了。journalctl 就是 systemd 的日志查看工具。它比 dmesg 强大得多,因为它不仅能看内核日志,还能看所有系统服务的日志。你想想看,一个命令就能查遍整个系统的日志,多方便。
基本用法
# 查看所有日志(默认显示本次启动的)
journalctl
# 查看本次启动的日志
journalctl -b
# 查看上一次启动的日志(排查重启前的问题)
journalctl -b -1
# 实时跟踪日志
journalctl -f
按服务过滤
这是 journalctl 最实用的功能之一。我记得有一次,SSH 服务死活起不来,我就是用这个命令定位的:
# 查看 SSH 服务的日志
journalctl -u sshd.service
# 查看 NetworkManager 的日志
journalctl -u NetworkManager.service
# 查看某个服务的最近10条日志
journalctl -u nginx.service -n 10
按时间过滤
时间过滤也很常用。比如你想看“昨天下午3点到4点之间”发生了什么:
# 查看最近5分钟的日志
journalctl --since "5 min ago"
# 查看某个时间段的日志
journalctl --since "2024-01-15 14:00" --until "2024-01-15 15:00"
# 查看昨天的日志
journalctl --since yesterday
按优先级过滤
日志有不同级别,从 emerg(紧急)到 debug(调试)。我只想看错误和警告:
# 只看错误级别及以上的日志
journalctl -p err
# 查看警告级别及以上的日志
journalctl -p warning
我曾经踩过的坑: journalctl 默认只保留最近几次启动的日志。如果你需要长期保留,一定要配置 /etc/systemd/journald.conf 中的 SystemMaxUse 和 MaxRetentionSec 参数。否则,当你需要回溯一个月前的日志时,会发现它已经被自动清理了。
3.3 /var/log/ 目录结构:传统日志的“档案馆”
虽然 journalctl 很强大,但很多老牌服务仍然会把日志写到 /var/log/ 目录下。这个目录就像系统的档案馆,按服务分门别类存放日志文件。我建议你熟悉一下这个目录的结构,因为有些问题,journalctl 不一定能覆盖到。
核心日志文件一览
| 日志文件 | 内容说明 | 我的使用场景 |
|---|---|---|
/var/log/messages |
通用系统日志,包含大多数非关键信息 | 老系统上排查问题时,我第一个看它 |
/var/log/syslog |
Debian/Ubuntu 上的通用日志 | Ubuntu 服务器上,我习惯看这个 |
/var/log/dmesg |
内核环缓冲区的持久化副本 | 启动后立即查看,比 dmesg 命令更稳定 |
/var/log/boot.log |
系统启动时的服务启动日志 | 排查哪个服务启动失败时,我翻它 |
/var/log/auth.log |
认证日志,包括登录、sudo 等 | 排查用户登录失败或权限问题时,必看 |
/var/log/kern.log |
内核日志,比 dmesg 更详细 | 内核崩溃或硬件驱动问题时,我查它 |
/var/log/secure |
CentOS/RHEL 上的安全认证日志 | CentOS 上排查 SSH 爆破时,我盯它 |
日志轮转机制
你可能会发现,这些日志文件后面有数字,比如 messages.1、messages.2.gz。这是 logrotate 在干活。它定期压缩、归档旧日志,防止日志文件撑爆磁盘。
为什么会这样?因为如果不轮转,一个日志文件可能几天就涨到几个 GB。我曾经见过一台服务器,因为日志没轮转,/var 分区被写满,导致系统直接挂掉。嗯,这里要注意,一定要检查 logrotate 的配置是否正常。
# 查看 logrotate 配置
cat /etc/logrotate.conf
# 查看某个服务的轮转配置
cat /etc/logrotate.d/nginx
我的排查习惯: 遇到启动问题,我通常按这个顺序查:
- 先跑
journalctl -b -p err,快速定位错误 - 如果没找到,再看
dmesg -T | grep -i error - 最后翻
/var/log/boot.log和/var/log/messages
这个流程,能覆盖 90% 的启动故障场景。
3.4 三者对比:什么时候用哪个?
| 工具 | 优势 | 劣势 | 最佳使用场景 |
|---|---|---|---|
| dmesg | 轻量、实时、专注内核 | 缓冲区有限,易被覆盖 | 硬件检测、驱动加载、内核 panic |
| journalctl | 功能全面、持久化、支持过滤 | 依赖 systemd,占用磁盘较大 | 服务故障、用户认证、系统级排查 |
| /var/log/ | 传统稳定、文件格式简单 | 分散、需要手动 grep | 老系统、特定服务日志、审计需求 |
说白了,这三个工具不是互斥的,而是互补的。我建议你三个都掌握,遇到问题时,哪个顺手就用哪个。毕竟,能最快找到问题原因的工具,就是好工具。