spring boot 各种日志jar包冲突解决办法

接入logback日志的项目为了不被第三方jar包意外引入其他日志框架,可以用以下代码进行排除,开发环境本地classpath还是有这些jar包,但是打包不会被打进去

1.坐标方式



 log4j
 log4j
 1.2.17
 provided


 org.slf4j
 slf4j-log4j12
 1.7.21
 provided


 org.apache.logging.log4j
 log4j-api
 2.7
 provided


 org.apache.logging.log4j
 log4j-1.2-api
 2.8.2
 provided


 org.apache.logging.log4j
 log4j-core
 2.6.2
 provided


 org.apache.logging.log4j
 log4j-slf4j-impl
 2.8.2
 provided


 org.apache.logging.log4j
 log4j-to-slf4j
 2.11.0

    org.slf4j
    log4j-over-slf4j
    1.7.21

 



 commons-logging
 commons-logging
 1.1.1
 provided


 org.slf4j
 slf4j-jcl
 1.7.21
 provided

2.plugin方式(j-one抽包是抽的文件夹,不是最终的war包,这种方式暂时不能用)

第一种方式可能语义不够清晰,看起来不容易理解,所以这里又添加了war-plugin方式进行排除,只需要在war-plugin配置中添加jar包排除


%regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar],
WEB-INF/lib/commons-logging-*.jar,
WEB-INF/lib/slf4j-jcl-*.jar,

WEB-INF/lib/slf4j-log4j12-*.jar

spring-boot项目同时也需要在spring-boot-maven-plugin配置中添加以下配置(不添加排除不了,具体原因细节未知)

log4j,slf4j-log4j12,log4j-api,log4j-slf4j-impl,commons-logging,slf4j-jcl

理论部分:

项目中使用logback作为具体的实现,防止其他具体日志框架绑定到slf4j,所以

第一步 排除其他日志框架的具体实现依赖已经其他日志框架到sll4j的关联;

log4j version1版本: log4j:log4j  org.slf4j:slf4j-log4j12(关联slf4j)

log4j version2版本: org.apache.logging.log4j:log4j-api org.apache.logging.log4j:log4j-core  org.apache.logging.log4j:log4j-1.2-api (v1升级兼容包)   org.apache.logging.log4j:log4j-slf4j-impl(关联slf4j)

jcl: commons-logging:commons-logging  org.slf4j:slf4j-jcl(关联slf4j)

第二步:有些依赖方不使用slf4j门面,直接使用具体的日志实现,需要增加具体实现日志包到slf4j桥接

log4j version1版本: log4j-over-slf4j

log4j version2版本: log4j-to-slf4j

jcl:jcl-over-slf4j

同时,我们由于使用spring boot日志starter,该依赖会自动处理log4j version1 和 jcl 依赖问题,所以再此基础上还需要增加log4j version2的桥接,不过为了安全,应该都配置到pom中;

不然使用这两种日志的class会在日志输出时报NoClassDefError

你可能感兴趣的:(java)