Tomcat9中Log4j2初始化失败:类转换与格式符异常排查
Apache Tomcat 9中Log4j2初始化异常排查与解决
一、解决Lookup类的ClassCastException
这类异常本质是类加载器冲突,结合你的配置场景,排查以下两点:
- 检查依赖重复与版本一致性:
确认Web应用的WEB-INF/lib目录下,是否存在log4j-core.jar、log4j-api.jar、log4j-web.jar。如果有,要么全部删除,统一放到Tomcat的lib目录;要么保留WEB-INF/lib下的所有Log4j2依赖,删除Tomcat/lib下的对应包。必须保证所有Log4j2依赖版本完全一致(比如都是2.24.0),且只在一个类加载器层级存在——Tomcat的Common类加载器(加载Tomcat/lib)和WebApp类加载器(加载WEB-INF/lib)是父子关系,同一个类被两个加载器分别加载时,会被视为不同类,直接引发类型转换异常。 - 清理Tomcat临时缓存:
删除Tomcatwork/Catalina/localhost/你的应用名目录下的缓存文件,旧的类残留也可能导致类结构不匹配问题,删除后重启Tomcat。
二、解决格式转换符未识别错误
这个问题大概率是配置语法混淆或文件路径不正确:
- 修正PatternLayout语法:
Log4j2的PatternLayout使用%前缀的占位符,而非Log4j 1.x的方括号格式。把配置里的[msg]改为%msg,[n]改为%n。例如:# 错误写法 appender.console.layout.pattern=[%d{yyyy-MM-dd HH:mm:ss}] [msg][n] # 正确写法 appender.console.layout.pattern=[%d{yyyy-MM-dd HH:mm:ss}] %msg%n - 调整配置文件位置:
Log4j2默认从类路径根目录加载配置,建议把log4j2.properties放到src/main/resources目录(Maven/Gradle项目),编译后会自动复制到WEB-INF/classes,类加载器可直接读取。如果一定要放在WEB-INF下,需在web.xml中指定路径:<context-param> <param-name>log4jConfiguration</param-name> <param-value>WEB-INF/log4j2.properties</param-value> </context-param>
三、额外校验点
确认web.xml中Log4j监听器的配置顺序:Log4jServletContextListener要放在所有其他监听器之前,确保Log4j2优先完成初始化:
<listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <context-param> <param-name>log4jWebSupportEnabled</param-name> <param-value>true</param-value> </context-param>
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

