Log4J2动态Appender结合maven-shade-plugin失效问题排查
Log4j2 编程式添加Appender在maven-shade-plugin引入后失效问题排查
我通过编程方式添加了一个Appender,引入maven-shade-plugin前运行正常,添加后出现失效情况,现需排查原因。
以下为不同场景下Appender的工作状态:
- ✅ 在IDE(IntelliJ IDEA)中运行正常
- ❌ 使用shade(Uber/fat)jar时失效 <-- 现已修复 ✅ 见答案
- ✅ 使用独立jar包(应用jar、log4j jars)时正常
- ❌ 使用应用jar+解压后的log4j文件目录时失效
- ✅ 使用应用jar+重新压缩的log4j文件包时正常
示例项目
- 项目地址:GitHub仓库log4j2-thread-context
- 添加自定义Appender的代码位置:ThreadContextFileLogHandler.java第79行
- Appender失效时,无法在以下位置接收事件:ThreadContextFileLogHandler.java第156行
复现上述场景的步骤
mvn clean compile mkdir -p local/log4j-jars unzip $HOME/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar -d local/log4j-jars unzip -o $HOME/.m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar -d local/log4j-jars cd local/log4j-jars zip -r ../log4j-jars.zip . cd ../.. # 场景2 ❌ 使用fat jar java -cp "target/log4j-test-1.0-SNAPSHOT.jar" org.example.Main # 场景3 ✅ 使用独立jar包 java -cp "target/original-log4j-test-1.0-SNAPSHOT.jar:$HOME/.m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar:$HOME/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar" org.example.Main # 场景4 ❌ 使用解压后的log4j文件 java -cp "target/original-log4j-test-1.0-SNAPSHOT.jar:local/log4j-jars" org.example.Main # 场景5 ✅ 使用重新压缩的log4j文件 java -cp "target/original-log4j-test-1.0-SNAPSHOT.jar:local/log4j-jars.zip" org.example.Main
补充说明
在场景5中,我发现可以删除META-INF中的部分文件,但需保留以下内容才能让Appender正常工作:
META-INForg(包含Log4j2Plugins.dat)services(缺少该目录应用会崩溃)versionsMANIFES.MF
相关问题
- Log4j2的JsonTemplateLayout在maven-shade-plugin下无法工作:该问题似乎与
Log4j2Plugins.dat有关,但我的项目中该文件仅存在于log4j2-core中。 - 使用jar包运行Java程序和使用解压后的文件运行有区别吗?:根据我的问题,两者确实存在差异(可能META-INF目录的处理方式与jar包不同)
内容的提问来源于stack exchange,提问作者Ferran Maylinch
相关产品推荐
相关产品推荐

