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 中的 SystemMaxUseMaxRetentionSec 参数。否则,当你需要回溯一个月前的日志时,会发现它已经被自动清理了。

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.1messages.2.gz。这是 logrotate 在干活。它定期压缩、归档旧日志,防止日志文件撑爆磁盘。

为什么会这样?因为如果不轮转,一个日志文件可能几天就涨到几个 GB。我曾经见过一台服务器,因为日志没轮转,/var 分区被写满,导致系统直接挂掉。嗯,这里要注意,一定要检查 logrotate 的配置是否正常。

# 查看 logrotate 配置
cat /etc/logrotate.conf

# 查看某个服务的轮转配置
cat /etc/logrotate.d/nginx

我的排查习惯: 遇到启动问题,我通常按这个顺序查:

  1. 先跑 journalctl -b -p err,快速定位错误
  2. 如果没找到,再看 dmesg -T | grep -i error
  3. 最后翻 /var/log/boot.log/var/log/messages

这个流程,能覆盖 90% 的启动故障场景。

3.4 三者对比:什么时候用哪个?

工具 优势 劣势 最佳使用场景
dmesg 轻量、实时、专注内核 缓冲区有限,易被覆盖 硬件检测、驱动加载、内核 panic
journalctl 功能全面、持久化、支持过滤 依赖 systemd,占用磁盘较大 服务故障、用户认证、系统级排查
/var/log/ 传统稳定、文件格式简单 分散、需要手动 grep 老系统、特定服务日志、审计需求

说白了,这三个工具不是互斥的,而是互补的。我建议你三个都掌握,遇到问题时,哪个顺手就用哪个。毕竟,能最快找到问题原因的工具,就是好工具。