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 rsyslog,rsyslogd -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 -
日志重复
排查:是否同时启用imjournal与imuxsock
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. 练习与实验#
-
持久化与容量控制
- 目标:journald 保持 500M 占用,保留 7 天
- 操作:修改/etc/systemd/journald.conf,重启后用journalctl --disk-usage验证 -
联动落盘
- 目标:通过logger写入的日志进入/var/log/messages
- 操作:启用imjournal,注释imuxsock,写入后grep验证 -
远程转发
- 目标:将本机日志转发到 192.168.10.10
- 操作:配置omfwd,在服务端开启imtcp,用tail验证
通过合理配置 journald 与 rsyslog,可实现高性能采集、统一检索、灵活转发与合规留存,是日志体系可用性与可审计性的重要基础。