如何避免error.log文件中重复错误日志信息的输出?
解决重复数据库连接错误日志刷屏问题
你的问题是数据库连接故障时,应用持续输出大量重复的DB Crashed和Crashed错误日志,导致磁盘被占满。以下是针对主流Java日志框架的配置方案,可有效过滤重复日志:
一、Logback 配置方案
Logback 内置DuplicateMessageFilter,可直接过滤重复日志消息:
1. 全局重复日志过滤
将过滤器配置到目标Appender中:
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>error.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <!-- 重复消息过滤器 --> <filter class="ch.qos.logback.classic.filter.DuplicateMessageFilter"> <!-- 缓存的重复消息数量,避免内存溢出 --> <cacheSize>100</cacheSize> <!-- 同一条日志最多输出1次,后续重复直接过滤 --> <allowedRepetitions>1</allowedRepetitions> </filter> </appender> <root level="error"> <appender-ref ref="FILE"/> </root> </configuration>
2. 仅过滤特定数据库错误日志
如果只需过滤DB Crashed这类特定日志,可结合表达式过滤器:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>message contains "DB Crashed"</expression> </evaluator> <onMatch>NEUTRAL</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <filter class="ch.qos.logback.classic.filter.DuplicateMessageFilter"> <allowedRepetitions>1</allowedRepetitions> </filter>
二、Log4j2 配置方案
Log4j2 可通过频率限制或自定义逻辑过滤重复日志:
1. 用BurstFilter限制输出频率
设置单位时间内同类型日志的最大输出次数:
<Configuration status="WARN"> <Appenders> <File name="File" fileName="error.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %c{36} - %msg%n"/> <!-- 1分钟内同级别同消息的日志最多输出1次 --> <BurstFilter level="ERROR" rate="1" maxBurst="1" timeUnit="MINUTES"/> </File> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="File"/> </Root> </Loggers> </Configuration>
2. 自定义脚本过滤重复消息
通过RewriteAppender结合JS脚本精确过滤重复的数据库错误日志:
<Rewrite name="Rewrite"> <AppenderRef ref="File"/> <ScriptRewritePolicy language="JavaScript"> <Script><![CDATA[ var lastDbErrorMsg = ""; function rewrite(event) { var msg = event.getMessage(); // 仅过滤重复的DB Crashed日志 if (msg === lastDbErrorMsg && msg.includes("DB Crashed")) { return null; } lastDbErrorMsg = msg; return event; } ]]></Script> </ScriptRewritePolicy> </Rewrite>
三、根源优化建议
- 调整重试逻辑:给数据库连接重试设置次数上限,或添加指数退避策略(重试间隔逐渐延长),从源头减少重复错误产生;
- 日志滚动配置:开启日志按大小/时间自动切割,避免单个日志文件无限膨胀;
- 代码层控制:捕获数据库连接异常后,不要在循环中重复打印日志,改为仅记录首次异常或间隔性状态日志。
内容的提问来源于stack exchange,提问作者Mannu
相关产品推荐
相关产品推荐

