4. Linux 系统日志体系:/var/log 目录结构、rsyslog 配置、journalctl 与 systemd-journald
在通信故障定位中,Linux 系统日志是还原事件时间线、追溯异常进程、分析网络连接状态的第一手数据源。本章深入剖析 /var/log 目录结构、rsyslog 配置体系以及 systemd-journald 与 journalctl 三大核心模块,帮助你在故障现场快速定位日志入口并提取关键证据。
4.1 /var/log 目录结构详解
/var/log 是 Linux 系统日志的默认存储目录。不同发行版在文件命名上略有差异,但核心日志文件的功能一致。下表列出故障定位中最常访问的日志文件:
| 日志文件 | 来源/守护进程 | 典型内容 | 故障定位用途 |
|---|---|---|---|
messages | rsyslog | 通用系统消息、内核日志、服务启停 | 排查服务崩溃、硬件错误 |
syslog | rsyslog | 与 messages 类似,Debian/Ubuntu 主日志 | 综合故障时间线重建 |
auth.log | rsyslog | 认证事件:SSH 登录、sudo、PAM | 检测暴力破解、权限提升 |
kern.log | rsyslog | 内核日志:驱动、OOM、panic | 分析内核级网络丢包、死锁 |
daemon.log | rsyslog | 各类守护进程日志 | 跟踪特定服务异常 |
debug | rsyslog | 调试级别日志(通常关闭) | 开启后用于深度诊断 |
lastlog | login | 各用户最近一次登录时间 | 排查异常登录时间点 |
btmp | login | 失败的登录尝试(二进制) | 统计暴力破解频率 |
wtmp | init/getty | 所有登录/注销记录(二进制) | 审计用户会话时长 |
/var/log/messages 是主日志;在 Ubuntu 18.04+ 中,主日志为 /var/log/syslog。故障定位时建议先检查这两个文件,再根据故障类型定向查看 auth.log 或 kern.log。
4.2 rsyslog 配置体系
rsyslog 是 Linux 上最主流的系统日志守护进程,支持模块化扩展、高可靠性传输(RELP/TCP/TLS)以及灵活的过滤与路由规则。其配置文件位于 /etc/rsyslog.conf 和 /etc/rsyslog.d/*.conf。
4.2.1 配置语法核心:选择器 + 动作
rsyslog 的每条规则由 选择器(selector) 和 动作(action) 两部分组成,格式为:
设施.级别 动作
常见设施(facility)与级别(severity)对照表:
| 设施 | 关键字 | 说明 | 级别(从高到低) | 关键字 |
|---|---|---|---|---|
| 内核 | kern | 内核产生的消息 | 紧急 | emerg |
| 用户级 | user | 用户进程 | 警报 | alert |
| 邮件 | 邮件系统 | 严重 | crit | |
| 守护进程 | daemon | 系统守护进程 | 错误 | err |
| 认证 | auth | 安全/认证 | 警告 | warning |
| 系统日志 | syslog | syslog 内部 | 通知 | notice |
| 打印 | lpr | 打印子系统 | 信息 | info |
| 新闻 | news | 网络新闻 | 调试 | debug |
| 本地 0-7 | local0-local7 | 自定义设施 | — | — |
4.2.2 典型配置示例
以下配置将所有设施的信息级别及以上日志写入 /var/log/messages,并将认证日志单独分离:
# /etc/rsyslog.conf 片段
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
*.emerg :omusrmsg:*
/etc/rsyslog.d/ 下创建独立配置文件,将特定服务(如 sshd、nginx、iptables)的日志定向到独立文件,避免被其他日志淹没。
4.2.3 远程日志传输配置
rsyslog 支持将日志集中发送到远程日志服务器,这在分布式系统故障定位中至关重要:
# 发送端(客户端)配置
*.* @192.168.1.100:514 # 使用 UDP 发送
*.* @@192.168.1.100:514 # 使用 TCP 发送(更可靠)
# 接收端(服务器)配置
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
4.3 systemd-journald 与 journalctl
systemd-journald 是 systemd 体系下的日志收集守护进程,以二进制格式存储日志,支持结构化元数据(如 PID、UID、内核设施、优先级等)。相比 rsyslog 的纯文本日志,journald 提供更高效的查询和过滤能力。
4.3.1 journald 核心特性
- 二进制存储: 日志写入
/run/log/journal/(内存)或/var/log/journal/(持久化),避免文本解析开销。 - 结构化字段: 每条日志包含
MESSAGE、PRIORITY、SYSLOG_FACILITY、_PID、_COMM、_SYSTEMD_UNIT等 50+ 个预定义字段。 - 自动关联: 日志自动关联 systemd 单元,可直接查看某个服务的完整日志流。
- 索引与压缩: 默认启用 LZ4 压缩,支持按时间、字段快速索引。
4.3.2 journalctl 常用查询命令
journalctl 是查询 journald 日志的命令行工具,以下是在通信故障定位中最高频使用的命令:
| 命令 | 说明 | 故障定位场景 |
|---|---|---|
journalctl -u sshd | 查看 sshd 单元的所有日志 | 排查 SSH 连接失败原因 |
journalctl -u nginx --since "10 min ago" | 查看 nginx 最近 10 分钟日志 | 快速定位近期服务异常 |
journalctl -p err -b | 查看本次启动以来的错误级别日志 | 系统启动故障快速诊断 |
journalctl _PID=1234 | 按进程 ID 过滤日志 | 追踪特定进程的完整行为 |
journalctl -k | 仅显示内核日志 | 分析内核网络栈错误 |
journalctl -f | 实时跟踪新日志(类似 tail -f) | 实时监控故障复现过程 |
journalctl --output=json-pretty | 以 JSON 格式输出,含所有字段 | 脚本解析、自动化告警 |
4.3.3 journald 与 rsyslog 的协同工作
在现代 Linux 发行版中,rsyslog 和 journald 通常并行运行。rsyslog 可以通过 imjournal 模块从 journald 读取日志,再按传统规则写入文本文件。这种架构兼具 journald 的结构化能力和 rsyslog 的灵活路由能力。
# /etc/rsyslog.conf 中启用 imjournal 模块
module(load="imjournal" StateFile="imjournal.state")
*.info;mail.none;authpriv.none;cron.none /var/log/messages
/var/log/messages 中缺少某段时间的日志,而 journalctl 中有完整记录,通常是因为 rsyslog 的 imjournal 模块状态文件损坏或 journald 日志轮转导致读取偏移。此时应直接使用 journalctl 作为主要查询工具。
4.4 日志轮转与持久化配置
为避免日志占满磁盘,Linux 通过 logrotate 工具管理日志轮转。journald 自身也支持按大小、时间轮转。在故障定位中,需确保日志保留策略满足合规要求:
# /etc/logrotate.d/rsyslog 示例
/var/log/messages
{
rotate 4
weekly
compress
delaycompress
missingok
notifempty
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service
endscript
}
# journald 持久化与大小限制(/etc/systemd/journald.conf)
[Journal]
Storage=persistent
SystemMaxUse=1G
SystemMaxFileSize=200M
MaxRetentionSec=2week
zcat /var/log/messages-*.gz | grep "关键词" 或 journalctl --rotate 强制轮转后查询。对于 journald,设置 Storage=persistent 并分配足够空间,避免重启后丢失启动前日志。
4.5 本章小结
- /var/log 目录 是传统文本日志的存放位置,
messages、syslog、auth.log是故障定位的三大入口。 - rsyslog 通过选择器+动作的灵活语法,支持本地分类存储和远程集中传输,是构建企业级日志架构的基础。
- systemd-journald + journalctl 提供结构化、索引化的二进制日志,查询效率高,适合快速过滤和自动化分析。
- 两者协同工作时,建议优先使用
journalctl进行实时查询,使用 rsyslog 进行长期归档和远程转发。