rsyslog 的 repeatedmsgreduction(重复消息压缩)怎么用?
rsyslog 的 $RepeatedMsgReduction 会把连续重复的消息压缩为"last message repeated N times"。配置位置、开关方式及注意事项本文详解。
$RepeatedMsgReduction on 让 rsyslog 把连续重复的消息压缩成一条 last message repeated N times,防止相同报错刷屏。传统配置写在 rsyslog.conf;当前版本需按输入模块支持情况核对;不存在通用 imfile compressRepeatedMsgs 参数。
基本配置
# /etc/rsyslog.conf(传统指令)
$RepeatedMsgReduction on
开启后,短时间内连续重复的相同消息会被合并:
Jan 15 10:30:00 host app: connection failed
Jan 15 10:30:05 host rsyslogd: last message repeated 47 times
注意事项
- 只在消息完全相同且连续时生效:中间夹一条别的消息就重新计数;
- 可能掩盖问题:排障时"repeated N times"让你看不到每次失败的具体上下文;
- 较新版本默认行为有变化:上游默认关闭;发行版配置可能覆盖。自 7.3.2 起缩减逻辑位于输入侧,匹配还考虑消息、主机、应用/进程标识,并非仅按最终文本。
更精细的控制(RainerScript)
imfile 没有本文原先列出的 compressRepeatedMsgs 参数。使用受支持的全局重复消息缩减设置,并先通过配置校验;不要给 input 添加未定义参数。
应用侧更优的做法
与其让 syslog 压缩重复,不如在应用层控制:日志框架的限流(logback 的 DuplicateMessageFilter、自定义 rate limiter)从源头减少重复输出。
常见问题(FAQ)
Q:开启后 grep 不到报错原文了?
A:只有第一条保留原文,后续都是 "repeated N times"。排障需要完整原文时应关闭此功能。
Q:这个功能在 UDP syslog 传输上有效吗?
A:现代版本在支持该功能的输入侧执行,不能假定所有输入/转发链路都一样;需检查接收端实际计数记录。
Q:journald 也有类似机制吗?
A:systemd-journald 默认也有速率限制(RateLimitIntervalSec/RateLimitBurst),超出的消息可能被丢弃并产生抑制摘要;这是速率限制,不是按相同内容合并重复消息。