1.6.2 rsyslog与systemd-journald配置

在现代 Linux 系统中,日志主要由 rsyslog 与 systemd-journald 共同承担:journald 负责收集内核、系统服务与应用输出,rsyslog 负责结构化分发、过滤与落盘。两者协同可实现更强的可观测性与集中化管理。本节聚焦二者的核心配置、常见参数与联动策略。

1. systemd-journald 基础与关键配置#

journald 默认将日志保存在内存或磁盘中,提供高性能检索能力。核心配置文件为 /etc/systemd/journald.conf(或 /etc/systemd/journald.conf.d/*.conf)。

原理草图

flowchart LR
  A[内核/服务stdout] --> B[systemd-journald]
  B --> C[/run/log/journal 内存]
  B --> D[/var/log/journal 持久化]
  D --> E[rsyslog imjournal]
  E --> F[/var/log/* 或 远程]

常用配置项
- Storage=:日志存储方式
- auto(默认,/var/log/journal 存在则持久化)
- persistent(强制持久化)
- volatile(仅内存)
- SystemMaxUse=:日志最大占用空间(如 1G)
- SystemKeepFree=:磁盘保留空间阈值
- SystemMaxFileSize=:单个日志文件最大尺寸
- MaxRetentionSec=:日志最大保留时间
- Compress=:是否压缩(建议开启)
- RateLimitIntervalSec=RateLimitBurst=:日志速率限制,防止洪泛

示例:启用持久化并限制占用

# /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=1G
SystemKeepFree=2G
MaxRetentionSec=30day
Compress=yes
RateLimitIntervalSec=30s
RateLimitBurst=1000

生效与验证

# 创建持久化目录
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal

# 重启服务
sudo systemctl restart systemd-journald

# 验证存储路径
journalctl --disk-usage
ls -ld /var/log/journal

常用命令与解释
- journalctl -b:查看本次启动日志(-b=boot)
- journalctl -u nginx:查看指定服务日志
- journalctl -p err..alert:查看错误级别以上
- journalctl --since "2024-01-01" --until "2024-01-02":时间范围查询
- journalctl -o short-iso:以 ISO 时间输出

2. rsyslog 架构与核心配置#

rsyslog 采用模块化架构,支持高性能队列、规则过滤、远程转发与多目标输出。主配置文件为 /etc/rsyslog.conf,扩展目录 /etc/rsyslog.d/*.conf

安装与服务管理(RHEL/CentOS)

sudo yum install -y rsyslog
sudo systemctl enable --now rsyslog
sudo systemctl status rsyslog --no-pager

安装与服务管理(Ubuntu/Debian)

sudo apt update
sudo apt install -y rsyslog
sudo systemctl enable --now rsyslog
sudo systemctl status rsyslog --no-pager

核心概念
- 输入模块:imuxsock、imklog、imjournal、imudp、imtcp
- 规则:基于 facility/priority 或条件表达式的路由
- 输出:文件、远程服务器、数据库、消息队列等

常见配置项
- module(load="imjournal"):读取 journald 日志
- global(workDirectory="/var/lib/rsyslog"):工作目录
- *.* /var/log/messages:简单路由规则
- *.info;mail.none;authpriv.none;cron.none /var/log/messages

示例:启用 journald 输入并落盘

# /etc/rsyslog.d/00-imjournal.conf
module(load="imjournal" StateFile="imjournal.state")

# /etc/rsyslog.d/50-default.conf
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
authpriv.*                                  /var/log/secure

重载并验证

sudo rsyslogd -N1   # 语法检查
sudo systemctl restart rsyslog

# 生成测试日志
logger -p user.info "rsyslog test message"

# 预期效果:/var/log/messages 出现测试行
tail -n 5 /var/log/messages

3. journald 与 rsyslog 联动策略#

在 systemd 系统中,推荐由 journald 统一采集,再由 rsyslog 读取并落盘或转发。

推荐流程
1. journald 统一采集(含服务 stdout/stderr)
2. rsyslog 通过 imjournal 读取
3. rsyslog 按规则落盘或远程转发

避免重复采集(关键点)
- 若启用 imjournal,通常不再启用 imuxsock 读取 /dev/log
- 可在 /etc/rsyslog.conf 中注释 imuxsock 模块

示例:仅启用 imjournal

# /etc/rsyslog.conf
# module(load="imuxsock")  # 注释掉避免重复
module(load="imjournal" StateFile="imjournal.state")

联动验证命令

# 1) 通过 logger 写入到 journald
logger -p local0.notice "hello journald->rsyslog"

# 2) 查看 journald
journalctl -t logger -n 5

# 3) 查看 rsyslog 落盘
grep "hello journald->rsyslog" /var/log/messages

4. rsyslog 远程日志与可靠队列#

集中式日志管理中常用 rsyslog 转发到远端(如日志服务器或 SIEM)。

示例:TCP 转发 + 队列保护

# /etc/rsyslog.d/60-forward.conf
action(
  type="omfwd"
  target="192.168.10.10"
  port="514"
  protocol="tcp"
  action.resumeRetryCount="-1"
  queue.type="LinkedList"
  queue.filename="fwdQueue"
  queue.maxDiskSpace="1g"
  queue.saveOnShutdown="on"
)

服务端监听示例(接收端)

# /etc/rsyslog.d/10-server.conf
module(load="imtcp")
input(type="imtcp" port="514")

*.* /var/log/remote/all.log

验证

# 客户端发送测试
logger -p local0.info "forward test"

# 服务器端检查
tail -n 5 /var/log/remote/all.log

5. 常见问题与排查思路#

  • 日志不落盘
    排查:systemctl status rsyslogrsyslogd -N1,确认规则与路径权限
    sudo systemctl status rsyslog --no-pager sudo rsyslogd -N1 sudo ls -l /var/log/messages

  • journald 无持久化
    排查:/var/log/journal 是否存在,权限是否正确
    ls -ld /var/log/journal sudo journalctl --disk-usage

  • 日志重复
    排查:是否同时启用 imjournalimuxsock
    grep -R "imjournal\|imuxsock" /etc/rsyslog.conf /etc/rsyslog.d/*.conf

  • 日志丢失
    排查:RateLimit、队列配置、磁盘空间
    journalctl -u systemd-journald -n 50 df -h /var

  • 时序错乱
    排查:时区与时间同步
    timedatectl systemctl status chronyd --no-pager

6. 练习与实验#

  1. 持久化与容量控制
    - 目标:journald 保持 500M 占用,保留 7 天
    - 操作:修改 /etc/systemd/journald.conf,重启后用 journalctl --disk-usage 验证

  2. 联动落盘
    - 目标:通过 logger 写入的日志进入 /var/log/messages
    - 操作:启用 imjournal,注释 imuxsock,写入后 grep 验证

  3. 远程转发
    - 目标:将本机日志转发到 192.168.10.10
    - 操作:配置 omfwd,在服务端开启 imtcp,用 tail 验证

通过合理配置 journald 与 rsyslog,可实现高性能采集、统一检索、灵活转发与合规留存,是日志体系可用性与可审计性的重要基础。