4. Linux 系统日志体系:/var/log 目录结构、rsyslog 配置、journalctl 与 systemd-journald

在通信故障定位中,Linux 系统日志是还原事件时间线、追溯异常进程、分析网络连接状态的第一手数据源。本章深入剖析 /var/log 目录结构、rsyslog 配置体系以及 systemd-journald 与 journalctl 三大核心模块,帮助你在故障现场快速定位日志入口并提取关键证据。

Linux 日志体系整体架构 应用程序 / 服务 rsyslog / syslog-ng systemd-journald /var/log/*.log /var/log/syslog / messages /run/log/journal 说明: 传统应用通过 syslog() 写入 rsyslog → 文本文件;systemd 单元默认通过 sd-journal 写入 journald → 二进制日志。 两者可并行运行,rsyslog 也可从 journald 读取日志后转存为文本文件。

4.1 /var/log 目录结构详解

/var/log 是 Linux 系统日志的默认存储目录。不同发行版在文件命名上略有差异,但核心日志文件的功能一致。下表列出故障定位中最常访问的日志文件:

日志文件来源/守护进程典型内容故障定位用途
messagesrsyslog通用系统消息、内核日志、服务启停排查服务崩溃、硬件错误
syslogrsyslog与 messages 类似,Debian/Ubuntu 主日志综合故障时间线重建
auth.logrsyslog认证事件:SSH 登录、sudo、PAM检测暴力破解、权限提升
kern.logrsyslog内核日志:驱动、OOM、panic分析内核级网络丢包、死锁
daemon.logrsyslog各类守护进程日志跟踪特定服务异常
debugrsyslog调试级别日志(通常关闭)开启后用于深度诊断
lastloglogin各用户最近一次登录时间排查异常登录时间点
btmplogin失败的登录尝试(二进制)统计暴力破解频率
wtmpinit/getty所有登录/注销记录(二进制)审计用户会话时长
实战提示: 在 CentOS/RHEL 7+ 中,/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
邮件mail邮件系统严重crit
守护进程daemon系统守护进程错误err
认证auth安全/认证警告warning
系统日志syslogsyslog 内部通知notice
打印lpr打印子系统信息info
新闻news网络新闻调试debug
本地 0-7local0-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
rsyslog 远程日志传输流程 客户端 rsyslog /etc/rsyslog.conf 传输协议 UDP 514 / TCP 514 日志服务器 /var/log/remote/ 故障定位场景: 当某台服务器网络中断时,集中式日志服务器仍保留中断前的最后日志,可据此判断是网络故障还是服务崩溃。 建议使用 TCP + RELP 模式确保日志不丢失。

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 作为主要查询工具。
journalctl 查询流程与日志字段结构 journalctl -u sshd /var/log/journal/ 二进制索引 + LZ4 压缩 结构化输出字段 MESSAGE | PRIORITY | _PID | _COMM _SYSTEMD_UNIT | SYSLOG_FACILITY journalctl JSON 输出示例(关键字段): {"__REALTIME_TIMESTAMP" : "1712345678123456", "MESSAGE" : "Failed password for root from 10.0.0.5 port 22", "PRIORITY" : "4", "_PID" : "1234", "_COMM" : "sshd", "_SYSTEMD_UNIT" : "sshd.service", "SYSLOG_FACILITY" : "10"} 通过 --output=json-pretty 可获取完整字段,用于自动化分析。

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 进行长期归档和远程转发。