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
相关产品推荐
相关产品推荐

