实现Syslog实时转发与冗余备份需同步发往多目标、本地留存+远程归档双保险,并在断链时磁盘暂存不丢日志;核心是rsyslog多目标TCP转发、disk-assisted队列、logrotate分层保留及链路健康验证。

要实现 Syslog 实时转发并构建冗余日志备份中心,核心是让日志“不只存一份”,而是同步发往多个目标、本地留存+远程归档双保险,并在链路中断时仍能暂存不丢。这不是简单加几行配置就能搞定的事,关键在传输可靠性、目标多样性与故障缓冲能力。
用 rsyslog 实现多目标实时转发
rsyslog 支持一条日志同时输出到多个目的地,适合构建主备或多地归档架构:
- 在 /etc/rsyslog.d/backup.conf 中添加类似配置:
*.* @@192.168.10.100:514 # 主日志服务器(TCP,可靠)
*.* @@192.168.10.101:514 # 备份服务器(TCP)
*.* /var/log/central-backup.log # 本地冗余副本(文件落地)
- 使用 @@ 表示 TCP 协议(比 @ 的 UDP 更可靠),避免网络抖动导致丢日志;
- 可叠加 disk-assisted queue 配置,在远程不可达时自动缓存到磁盘,恢复后重发;
- 建议为每个目标单独定义 action 块,便于启用独立重试、限速或失败告警。
启用磁盘队列保障断网不丢日志
默认 rsyslog 内存队列在服务重启或网络中断时会丢数据。开启磁盘缓冲是冗余备份的前提:
- 在配置开头加载队列模块:$ModLoad imuxsock # 提供本地 socket 输入
$ModLoad omfwd # 转发模块; - 为远程转发动作添加磁盘队列参数:
action(type="omfwd" target="192.168.10.100" port="514" protocol="tcp"
queue.type="Disk" queue.filename="fwddiskq"
queue.maxdiskspace="1g" queue.saveonshutdown="on")
- 这样即使主备服务器同时离线,日志仍会暂存在 /var/lib/rsyslog/ 下,最大占 1GB 空间;
- queue.saveonshutdown="on" 确保 rsyslog 重启时不丢失待发日志。
搭配 logrotate 实现本地日志分层保留
仅靠转发还不够——本地原始日志仍是第一手证据,需配合轮转策略防止撑爆磁盘:
- 编辑 /etc/logrotate.d/rsyslog-local:
/var/log/messages /var/log/secure /var/log/central-backup.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service > /dev/null 2>&1 || true
endscript
}
- 保留 30 天本地副本,压缩节省空间,postrotate 触发 rsyslog 重新打开日志文件;
- 把转发落地的 central-backup.log 也纳入轮转,形成“本地缓存 → 远程备份 → 本地归档”三层结构。
验证与监控转发链路健康状态
转发是否真正在工作?不能只看服务是否 running:
- 用 rsyslogd -N1 检查配置语法;
- 用 logger "test-$(date)" 发送测试日志,立刻在所有目标端(远程服务器 + 本地文件)确认是否收到;
- 监控 rsyslog 队列积压:rsyslogd -d | grep queue 或查看 /var/log/syslog 中的 imjournal/omfwd 错误日志;
- 对关键服务器,可在远程端部署轻量脚本,每 5 分钟检查最新日志时间戳,超时即触发邮件告警。

















