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

Scala测试中LoggerTest无法识别src/test/resources下的log4j2.properties

解决Spark测试环境下Log4j2配置加载异常问题

看起来你遇到的核心问题是Log4j 1.x与Log4j2的依赖冲突,再加上Maven/IntelliJ测试类路径的加载逻辑干扰,导致测试时日志配置出现混乱。我帮你拆解下问题原因和解决步骤:

一、问题根源分析

Spark默认依赖的是Log4j 1.x(log4j:log4j),而你在测试环境中用的是Log4j2的配置文件,这就造成了加载逻辑的矛盾:

  • 当你用log4j2.properties时,测试环境中残留的Log4j1加载器无法识别这个文件,只能 fallback 读取src/main/resources下的Log4j1配置(log4j.properties)。
  • 当你把文件重命名为log4j.properties,Log4j1加载器能找到文件,但你的代码实际用的是Log4j2的API,此时Log4j2的初始化逻辑找不到自己专属的配置,就会抛出那个"找不到配置文件"的错误。

二、分步解决方案

1. 统一日志依赖,排除冲突包

首先要在Maven pom.xml里把Spark依赖中的Log4j1相关包排除,同时明确引入Log4j2的全套依赖(包括SLF4J桥接,因为Spark用SLF4J做日志门面):

<!-- 排除Spark依赖中的Log4j1和SLF4J-Log4j12桥接 -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>你的Spark版本</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 引入Log4j2依赖 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.20.0</version> <!-- 建议用最新稳定版 -->
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
</dependency>
<!-- SLF4J桥接到Log4j2,确保Spark的日志输出走Log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.20.0</version>
</dependency>

2. 确保测试资源的加载优先级

Maven默认会把src/test/resources下的资源放到测试类路径的最前面,优先级高于src/main/resources,但IntelliJ有时会出现配置不同步的情况:

  • 先执行Maven命令刷新依赖并同步资源:
    mvn clean install -DskipTests
    
  • 在IntelliJ中,点击右侧Maven面板的「Reload All Maven Projects」按钮,确认src/test/resources被识别为测试资源(图标是带蓝色测试标记的文件夹)。

3. 强制指定测试时的Log4j2配置(可选)

如果还是有加载问题,可以在测试运行时手动指定配置文件路径:

  • IntelliJ测试配置:打开测试类的运行配置,在「VM options」中添加:
    -Dlog4j.configurationFile=src/test/resources/log4j2.properties
    
  • Maven Surefire插件配置:在pom.xml中添加插件配置,确保测试时传递该参数:
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.1.2</version>
                <configuration>
                    <systemPropertyVariables>
                        <log4j.configurationFile>${project.basedir}/src/test/resources/log4j2.properties</log4j.configurationFile>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

4. 验证代码中的日志类导入

最后检查你的测试代码,确保导入的是Log4j2的Logger类,而不是Log4j1的:

  • 正确导入:
    import org.apache.logging.log4j.Logger
    import org.apache.logging.log4j.LogManager
    
  • 错误导入(要避免):
    import org.apache.log4j.Logger // 这是Log4j1的类
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:41:01