rsyslog 的 repeatedmsgreduction(重复消息压缩)怎么用?
rsyslog 的 $RepeatedMsgReduction 会把连续重复的消息压缩为"last message repeated N times"。配置位置、开关方式及注意事项本文详解。
$RepeatedMsgReduction on 让 rsyslog 把连续重复的消息压缩成一条 last message repeated N times,防止相同报错刷屏。传统配置写在 rsyslog.conf;现代版本建议结合 imfile/input 的参数按需控制。
基本配置
# /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"让你看不到每次失败的具体上下文;
- 较新版本默认行为有变化:部分发行版默认关闭,或改用
repeatedMsgContainsOriginalMsg等细粒度指令。
更精细的控制(RainerScript)
# 按输入单独控制(imfile 示例)
input(type="imfile"
File="/var/log/myapp/app.log"
Tag="myapp"
compressRepeatedMsgs="on"
)
应用侧更优的做法
与其让 syslog 压缩重复,不如在应用层控制:日志框架的限流(logback 的 DuplicateMessageFilter、自定义 rate limiter)从源头减少重复输出。
观测云对照
日志集中到观测云后,重复消息可以在平台侧聚合统计(按 message 聚合计数),无需在采集端压缩——既保留了完整数据,又能看到趋势。
常见问题(FAQ)
Q:开启后 grep 不到报错原文了?
A:只有第一条保留原文,后续都是 "repeated N times"。排障需要完整原文时应关闭此功能。
Q:这个功能在 UDP syslog 传输上有效吗?
A:RepeatedMsgReduction 作用于消息写入/转发阶段,对转发目标同样生效(发送方只发一条计数消息)。
Q:journald 也有类似机制吗?
A:systemd-journald 默认也有速率限制(RateLimitIntervalSec/RateLimitBurst),超出的消息被丢弃并计数。