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

将自定义Log4j2 Lookup类打包为Jar部署到Tomcat后失效问题排查

问题原因

核心问题是Log4j2的插件扫描机制:当自定义MyLookup打包成Jar放在WEB-INF/lib时,Log4j2没有识别到这个插件,导致无法解析${headerlookup:header}占位符。

Log4j2默认通过插件元数据文件(META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat)发现插件。把类放在WEB-INF/classes时,编译阶段的注解处理器会自动生成这个元数据文件到classes目录,Log4j2启动时能扫描到;但打包成Jar时如果没包含这个元数据文件,Log4j2就找不到你的自定义Lookup插件。

解决方法

方法1:打包Jar时生成插件元数据

如果用Maven构建,添加Log4j2的插件处理器依赖,让编译阶段自动生成插件元数据:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-plugin-processor</artifactId>
    <version>与你的Log4j2版本一致</version>
    <scope>provided</scope>
</dependency>

重新打包Jar后,Jar内部会包含Log4j2Plugins.dat文件,Log4j2启动时就能识别到headerlookup插件。

方法2:在Log4j2配置中手动注册插件

修改log4j2.xml,在<Configuration>节点下手动指定插件类,跳过元数据扫描:

<Configuration>
    <!-- 手动注册自定义Lookup插件 -->
    <Plugins>
        <Plugin type="StrLookup" name="headerlookup" class="你的MyLookup类全限定名"/>
    </Plugins>

    <RollingFile name="Appender">
        <FileName>file.xml</FileName>
        <PatternLayout header="${headerlookup:header}">
            <Pattern>%msg</Pattern>
        </PatternLayout>
        <Policies>
            <SizeBasedTriggeringPolicy size="6MB" />
        </Policies>
    </RollingFile>
</Configuration>

这种方式无需依赖元数据文件,Log4j2会直接加载指定的类作为Lookup插件。

额外检查点

  • 确认Jar包中确实包含MyLookup类,没有打包错误;
  • 确保Log4j2版本和代码兼容,比如AbstractLookup、@Plugin注解的包路径正确,避免版本不一致导致类加载问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:21:40