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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:32:34