rsyslog 的 repeatedmsgreduction(重复消息压缩)怎么用?

rsyslog 的 $RepeatedMsgReduction 会把连续重复的消息压缩为"last message repeated N times"。配置位置、开关方式及注意事项本文详解。

最佳实践
rsyslog 的 repeatedmsgreduction(重复消息压缩)怎么用?封面

$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

注意事项

  1. 只在消息完全相同且连续时生效:中间夹一条别的消息就重新计数;
  2. 可能掩盖问题:排障时"repeated N times"让你看不到每次失败的具体上下文;
  3. 较新版本默认行为有变化:上游默认关闭;发行版配置可能覆盖。自 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),超出的消息可能被丢弃并产生抑制摘要;这是速率限制,不是按相同内容合并重复消息。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台