接入logback日志的项目为了不被第三方jar包意外引入其他日志框架,可以用以下代码进行排除,开发环境本地classpath还是有这些jar包,但是打包不会被打进去
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
第一种方式可能语义不够清晰,看起来不容易理解,所以这里又添加了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