You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:09:30