通过Fat Jar运行主应用时Log4J未使用第三方SumoLogic Appender问题
我碰到过好几个类似的问题,大概率是Fat Jar打包时Log4J2的SPI插件加载机制出了问题,或者你漏加了SumoLogic Appender的核心依赖,咱们一步步来排查解决:
1. 先确认核心依赖是否齐全
首先,你得确保SumoLogic的Log4J2 Appender依赖已经加到你的pom.xml里了——光有log4j-api和core是不够的,第三方Appender本身的jar必须包含进来。比如:
<dependency> <groupId>com.sumologic.plugins.log4j</groupId> <artifactId>sumologic-log4j2-appender</artifactId> <version>2.17.0</version> <!-- 建议使用最新稳定版 --> </dependency>
2. 解决SPI文件被覆盖的核心问题
这是Fat Jar打包时最常见的坑:Log4J2通过**SPI(服务提供者接口)**自动发现第三方插件(比如SumoLogic Appender),每个插件jar里都有一个META-INF/services/org.apache.logging.log4j.core.config.plugins.PluginService文件,记录了插件的注册信息。
但maven-assembly-plugin默认打包时,会把多个jar里的同名文件直接覆盖掉,导致SumoLogic Appender的SPI信息丢失,Log4J2根本找不到它。这里有两个可行的解决办法:
方法A:改用maven-shade-plugin打包(推荐)
Shade插件专门针对Fat Jar的依赖合并场景设计,支持自动合并SPI文件。把你原来的assembly插件配置替换成下面的shade配置即可:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 自动合并所有Log4J2的SPI注册文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 指定主类,方便直接运行Fat Jar --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainApplicationClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
方法B:修改maven-assembly-plugin配置合并SPI文件
如果你坚持要用assembly插件,需要在assembly的描述文件里配置文件合并规则:
- 先创建
src/main/assembly/assembly.xml文件:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> <id>fatjar</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>true</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> <containerDescriptorHandlers> <!-- 启用SPI文件合并处理器 --> <containerDescriptorHandler implementation="org.apache.maven.plugins.assembly.handlers.ServiceWorkerHandler"/> </containerDescriptorHandlers> <archive> <manifest> <mainClass>com.yourpackage.YourMainApplicationClass</mainClass> </manifest> </archive> </assembly>
- 然后在
pom.xml的assembly插件中引用这个描述文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptor>src/main/assembly/assembly.xml</descriptor> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
3. 最后验证Log4J2配置文件
检查你的log4j2.xml(或其他格式的配置文件)是否正确配置了SumoLogic Appender,比如:
<Appenders> <SumoLogicAppender name="SumoLogic" url="https://collectors.sumologic.com/receiver/v1/http/your-unique-endpoint" sourceName="YourApplicationName" sourceCategory="YourLogCategory"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </SumoLogicAppender> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="SumoLogic"/> </Root> </Loggers>
确保Appender的类名、接入URL等参数都配置正确。
重新打包后运行Fat Jar,应该就能正常加载SumoLogic Appender了~
内容的提问来源于stack exchange,提问作者Aimee

