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

通过Fat Jar运行主应用时Log4J未使用第三方SumoLogic Appender问题

解决方案:Log4J2第三方Appender在Fat Jar中无法加载的问题

我碰到过好几个类似的问题,大概率是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的描述文件里配置文件合并规则:

  1. 先创建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>
  1. 然后在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:53