遗留WAR应用迁移至Tomcat10后Log4J日志配置异常求助
问题分析与解决方案
核心问题拆解
- ClassNotFoundException 根源:你给
slf4j-api和jcl-over-slf4j设置了<optional>true</optional>,这会导致Maven不将这两个依赖打包到WAR的WEB-INF/lib目录中,应用启动时自然找不到org.slf4j.Logger类。 - SLF4J 绑定版本不兼容:SLF4J 2.x的提供商机制和1.x完全不同,你使用的
log4j-slf4j-impl是针对SLF4J 1.x的绑定,和你引入的SLF4J 2.0.12不兼容,这也是最初出现"No SLF4J providers were found"警告的核心原因。
修正后的依赖配置
替换当前日志依赖为以下内容:
<!-- 版本属性 --> <properties> <log4j.version>2.22.1</log4j.version> <slf4j.version>2.0.12</slf4j.version> </properties> <!-- Logging --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- 适配SLF4J 2.x的Log4j绑定 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> <version>${log4j.version}</version> </dependency>
关键调整说明
- 移除optional配置:
slf4j-api是应用日志的核心API,必须打包到应用中,不能设为可选。 - 替换Log4J绑定包:
log4j-slf4j2-impl是Log4j官方提供的适配SLF4J 2.x版本的绑定,能被SLF4J 2.x正确识别为日志提供商,解决最初的警告问题。 - 移除tomcat-juli依赖:Tomcat 10.1.x自带该日志组件,无需在应用中重复引入,避免潜在冲突。
额外验证步骤
- 执行
mvn clean package重新打包应用。 - 检查WAR包的
WEB-INF/lib目录,确认包含slf4j-api-2.0.12.jar、log4j-core-2.22.1.jar、log4j-slf4j2-impl-2.22.1.jar这几个核心依赖。 - 启动Tomcat,观察日志是否正常输出,无SLF4J相关警告。
内容的提问来源于stack exchange,提问作者Ivan Karotki
相关产品推荐
相关产品推荐

