如何通过log4net收集所有ERROR级异常并统一发送邮件?
如何用Log4Net收集所有ERROR级异常并合并发送邮件?
要实现只收集ERROR级日志并批量合并发送邮件,核心是先过滤掉非ERROR级日志,再配置批量触发规则,避免buffer缓存其他级别日志。具体修改如下:
关键配置调整思路
- 添加级别过滤器:只允许ERROR级日志进入邮件Appender的缓存,确保buffer里只有异常日志
- 设置批量缓存大小:调整
bufferSize为你期望的批量数量(比如5,积累5个ERROR时发送) - 可选定时触发:添加时间评估器,避免ERROR数量不足时一直不发送邮件(比如每30分钟强制发送一次)
修改后的完整配置
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> <to value="xxx@xxx.email" /> <from value="xxx@xxx.email" /> <subject value="系统异常汇总 - 共%count%个错误" /> <smtpHost value="host@host.host" /> <port value="25" /> <!-- 设置批量缓存的ERROR数量 --> <bufferSize value="5" /> <lossy value="true" /> <!-- 添加级别过滤器,仅保留ERROR级日志 --> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="ERROR" /> <acceptOnMatch value="true" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> <!-- 触发条件:当出现ERROR时检查是否满足发送规则 --> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="ERROR" /> </evaluator> <!-- 可选:定时触发,每30分钟发送一次(无论buffer是否满) --> <evaluator type="log4net.Core.TimeEvaluator"> <interval value="30" /> <!-- 单位:分钟 --> </evaluator> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline[%date] [%thread] %-5level %logger - %message%newline%exception%newline" /> </layout> </appender>
配置说明
- 级别过滤器:
LevelMatchFilter匹配ERROR级别,DenyAllFilter拒绝所有其他级别,确保只有ERROR日志进入缓存 - bufferSize:设置为N时,当积累N个ERROR日志,就会自动发送一封汇总邮件
- 双评估器:
LevelEvaluator确保ERROR出现时触发检查,TimeEvaluator避免长时间没有达到bufferSize导致日志积压(比如夜间少量错误不会等到第二天才发送) - 主题优化:
%count%变量会自动替换为当前邮件中的错误数量,方便直观看到异常规模
这样配置后,系统会将ERROR级日志批量缓存,要么积累到指定数量,要么到了定时时间,就会把所有缓存的ERROR合并成一封邮件发送,不会再每次ERROR单独发信,也不会混入INFO等其他级别日志。
内容的提问来源于stack exchange,提问作者Saiko
相关产品推荐
相关产品推荐

