ActionResumeRetryCount 必须配合磁盘持久化队列才能生效,否则因无缓存载体而重试无效;需配置ActionQueueFileName、ActionQueueMaxDiskSpace、ActionResumeRetryCount等参数,并确保目录权限正确。

ActionResumeRetryCount 是 rsyslog 中控制远程日志转发失败后重试行为的关键参数,直接影响网络中断、服务宕机等异常场景下的日志不丢失能力。它本身不单独起作用,必须配合队列(queue)机制使用,否则只是“纸上重试”——日志早已在内存中被丢弃。
? 为什么 ActionResumeRetryCount 单独配置无效?
rsyslog 默认采用无队列、非阻塞式转发:
- 日志产生 → 尝试发给远程服务器 → 若失败(如连接拒绝、超时)→ 立即丢弃(除非启用阻塞模式,但会卡住整个日志流)
- 此时即使设了
ActionResumeRetryCount -1(无限重试),也因没有缓存日志的载体而无物可重试
✅ 正确姿势是:启用磁盘持久化队列 + 设置重试策略 + 配合重连机制
? 必须配套的三大配置项
以下配置应写入 /etc/rsyslog.d/50-remote.conf 或类似独立配置文件:
# 1. 加载输出模块(TCP转发必需) module(load="omfwd") # 2. 定义全局队列参数(作用于后续所有 *.* @@... 规则) $ActionQueueFileName fwdRule1 # 队列文件前缀(实际生成 fwdRule1.00000001, .00000002...) $ActionQueueMaxDiskSpace 1g # 最大磁盘缓存空间(建议 ≥512M,避免满盘丢日志) $ActionQueueSaveOnShutdown on # 关机前把队列里未发完的日志刷到磁盘 $ActionQueueType LinkedList # 异步非阻塞队列(推荐) $ActionResumeRetryCount -1 # 连接失败后无限重试(-1 = 永不停止) $ActionQueueDiscardMark 0 # 禁用“丢弃标记”,防止高负载下主动丢日志 $ActionQueueHighWaterMark 100000 # 队列内存缓冲上限(单位条数,防OOM)
⚠️ 注意:
$ActionQueueFileName对应的目录(默认/var/lib/rsyslog/)需确保rsyslog用户有读写权限,否则队列初始化失败,rsyslog 会静默降级为内存队列(重启即清空)。
? 实际转发规则示例(TCP + TLS 更佳)
# 使用 @@ 表示 TCP(@@@ 表示 TLS),替换为你的日志服务器地址 *.* @@192.168.10.5:514;RSYSLOG_ForwardFormat # (可选)若启用了 TLS,还需加载 omfwd 的 tls 支持并配置证书路径 # module(load="omfwd" template="RSYSLOG_ForwardFormat" protocol="tcp" streamdriver="gtls" streamdrivermode="1" streamdriverauthmode="x509/name" streamdrivercafile="/etc/rsyslog.d/ca.pem")
✅ 验证是否生效的实操方法
-
检查队列目录是否生成文件
ls -l /var/lib/rsyslog/fwdRule1.* # 应看到类似 fwdRule1.00000001 的二进制文件
-
临时关停远端服务,观察本地队列增长
# 在客户端执行(模拟日志洪峰) logger "test log $(date)" ; logger "test log $(date)" ; logger "test log $(date)" # 然后用 journalctl -u rsyslog | grep queue 查看队列状态
-
查看 rsyslog 状态与错误
systemctl status rsyslog journalctl -u rsyslog -n 50 --no-pager | grep -i "queue\|retry\|fail"
? 补充增强建议(进阶鲁棒性)
- 启用
$MainMsgQueueSize 100000:提升主消息队列容量,避免上游日志洪峰直接压垮 - 添加
$ActionQueueDequeueSlowdown 1000:降低出队频率(毫秒级),缓解远端压力 - 使用
rebindinterval="60"(omfwd 参数):强制每60秒重新解析DNS,应对服务端IP漂移 - 配合
imjournal替代imuxsock:从 systemd journal 读取日志,避免logger命令漏日志
可靠日志转发不是靠单个参数实现的,而是队列 + 重试 + 持久化 + 监控反馈四者协同的结果。ActionResumeRetryCount 是其中“不放弃”的态度,但真正托底的是磁盘队列。


















