如何排除私有依赖的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




