You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何排除私有依赖的Log4j2以使用Logback与Lombok?

解决Logback与Log4j2依赖冲突的问题

你的推测完全正确——私有公司依赖private.company.dep:redacted确实引入了Log4j2相关组件,导致SLF4J的日志实现绑定发生冲突,所以才会出现Log4j2的配置提示错误。下面是具体的解决步骤:

第一步:排除私有依赖中的Log4j2组件

在Gradle的dependencies配置里,给私有依赖添加排除规则,移除所有Log4j2相关的模块:

dependencies {
    compile group: 'org.projectlombok', name: 'lombok', version: '1.16.20'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
    compile group: 'private.company.dep', name: 'redacted', version: '1.0.0' {
        // 排除所有Log4j2相关依赖
        exclude group: 'org.apache.logging.log4j'
    }
}

如果需要更精确的排除(比如只移除核心冲突模块),可以指定具体模块:

exclude group: 'org.apache.logging.log4j', module: 'log4j-core'
exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'

其中log4j-slf4j-impl是Log4j2绑定SLF4J的桥接包,这是引发冲突的关键,必须排除。

第二步:验证依赖排除结果

为了确保Log4j2已被完全移除,运行Gradle的依赖树命令检查:

./gradlew dependencies

在输出中搜索org.apache.logging.log4j,如果没有任何匹配结果,说明排除操作成功。

第三步:调整Logback配置(可选)

你当前的logback.xml仅对com.mkyong.web包开启了debug级别日志,根日志级别为error,所以MyTestApplication的info日志可能无法输出。可以给应用所在包添加单独的logger配置:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern> %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </Pattern>
        </layout>
    </appender>
    
    <!-- 替换为MyTestApplication所在的实际包名 -->
    <logger name="your.app.package" level="info" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    
    <logger name="com.mkyong.web" level="debug" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    
    <root level="error">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

补充说明

SLF4J的绑定规则是classpath中只能存在一个日志实现的绑定包,如果同时存在logback-classic(Logback的绑定包)和log4j-slf4j-impl(Log4j2的绑定包),SLF4J会优先加载最先找到的那个,这就是你看到Log4j2错误提示的原因——私有依赖引入的Log4j2绑定包先被加载了。

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

火山引擎 最新活动