rsyslogd配置:抑制重复告警X,遇告警Y时重置状态
解决rsyslog重复发送断连告警并在恢复后重置状态的方案
我刚好处理过几乎一模一样的场景,用rsyslog的自定义状态变量+条件判断就能完美解决你的需求——既实现断连时只发一次告警,又能在连接恢复后立即重置状态,确保下次断连能再次触发转发。
核心思路
我们通过rsyslog的全局自定义变量跟踪连接状态:
- 收到断连告警时,仅当状态为「未断连」时才转发告警,并标记状态为「已断连」
- 收到恢复告警时,立即重置状态为「未断连」,让下次断连能重新触发转发
具体配置示例
假设你原本的SNMP转发动作是用omfwd模块,把以下配置添加到你的rsyslog.conf或对应的规则文件中:
# 开头可以显式初始化连接状态(可选,未定义的变量默认视为空,不影响判断) set $!connFOOStatus = "up"; # 处理断连告警:仅在首次触发时转发 :msg, contains, "ERROR: Connection FOO is DOWN" { if $!connFOOStatus != "down" then { # 这里替换成你实际的SNMP转发动作 action( type="omfwd" target="your-snmp-proxy-ip" port="162" protocol="udp" template="your-snmp-template" ) # 标记状态为已断连,后续重复告警不再转发 set $!connFOOStatus = "down"; } } # 处理恢复告警:重置状态,允许下次断连触发转发 :msg, contains, "NOTICE: Connection FOO is UP" { set $!connFOOStatus = "up"; # 可选:如果需要转发恢复通知,在这里添加对应的action # action(type="omfwd" target="your-snmp-proxy-ip" port="162" protocol="udp" template="your-snmp-up-template") }
关键细节说明
- 自定义变量作用:
$!connFOOStatus是rsyslog的全局变量,会一直保留状态(除非rsyslog重启),完美替代execOnlyOnceEveryInterval的固定间隔限制,实现基于事件的状态控制 - 版本要求:确保你的rsyslog版本在v8.3.0及以上,这个版本才支持
$!开头的自定义属性变量 - 多连接扩展:如果需要跟踪多个连接,只需要给每个连接创建独立的变量(比如
$!connBARStatus对应Connection BAR),复制上述规则修改匹配内容即可 - Fallback方案(可选):如果担心恢复告警丢失,可以在断连转发动作中加上
execOnlyOnceEveryInterval="3600"(比如1小时),这样即使状态没重置,一小时后也会再次转发,优先还是依赖状态变量控制
这个方案完全贴合你的需求:断连时只发一次告警,连接恢复后立即重置状态,下次断连能立刻触发转发,不会再出现大量重复的SNMP信息。
内容的提问来源于stack exchange,提问作者the.jxc
相关产品推荐
相关产品推荐

