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

MAVEN项目仅引入log4j依赖无xml配置时日志重复打印问题求助

无log4j配置文件场景下日志重复打印的解决方案

问题原因

你遇到的重复打印是log4j 1.x的默认初始化逻辑导致的:没有显式配置文件时,log4j会自动调用BasicConfigurator初始化控制台输出器,如果项目中存在传递依赖的日志桥接包、或者多个启动上下文触发了多次初始化,就会注册多个重复的控制台输出器,最终每条日志打印多次。

解决方案

方案1:清理pom依赖冲突(无需修改业务代码)

优先排查传递依赖引入的多余日志桥接包,修改log4j依赖配置增加排除项即可:

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    <exclusions>
        <!-- 排除冲突的commons-logging桥接组件 -->
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
        <!-- 排除重复引入的slf4j-log4j桥接组件 -->
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

修改后执行mvn clean install重新构建项目即可生效。

方案2:代码手动初始化log4j配置(无需新增xml文件)

如果排除依赖后问题仍然存在,可以在项目启动入口的最前端添加静态初始化代码,主动清空重复注册的输出器,仅保留一个控制台输出器:

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

// 启动类静态代码块,优先级最高,会在所有日志打印前执行
static {
    // 清空所有已注册的日志输出器,解决重复注册问题
    Logger.getRootLogger().removeAllAppenders();
    // 手动注册单个控制台输出器,和默认输出格式保持一致
    Logger.getRootLogger().addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %-5p %c - %m%n")));
}

该方案不需要新增任何xml配置文件,仅需要添加几行初始化代码即可完全解决重复打印问题。

内容的提问来源于stack exchange,提问作者sunil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:06:02