本文章记录设置两个日志时候,控制台直接报错
标黄处就是错误原因:1. SLF4J(W):类路径包含多个SLF4J提供程序。
SLF4J(W):找到提供程序[org.apache.logging.slf4j. net]。
SLF4J(W):找到提供程序[ch.qos.log .classic.spi. SLF4JServiceProvider@50d0686]。
SLF4J(I):实际提供程序的类型为[org.apache.logging.slf4j]。SLF4JServiceProvider@50d0686]线程“main”异常java.lang.ExceptionInInitializerError:
从而引起的记录异常 : 2. log4j-slf4j2-impl不能与log4j-to-slf4j一起出现
下面分析原因:
-
两者都是日志的实现方式,也是当下最流行的,但是 logback是官方提供的,而 slf4j是开源的,也就是说两者作者不是一个人
-
但是这也不是二者起冲突的原因,主要原因是因为以下两点(如图所示)
-
1. 重复引入 slf4j-api,这可能会导致类路径中存在 多个 SLF4J API 的版本
-
2. 日志实现的多重性
-
3. log4j-slf4j2-impl
和log4j-to-slf4j
之间的不兼容性主要源于它们各自的设计使用不同。-
区别:它们处理的日志框架不同(Log4j 1 与 Log4j 2)
-
引发的问题:
-
-
-
解决方法:
-
根据项目需要选择其中一个,并移除不必要的日志实现依赖。
-
一般的项目默认使用的都是 Logback日志的实现,导致冲突都是引入Log4j2 日志实现而引起的。
-
所以下面方法是针对 要使用Log4j2 作为日志实现方式的修改
-
排除Logback日志的实现方式
<!--web前端互动的依赖--><!-- -starter-web 依赖中自动添加了 starter-logging 也就是logback 日志实现方式 的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--由于 引入了log4j2 日志实现方式 的依赖,两个日志实现方式会同时引入两种桥接器,导致程序报错。 --><!--排除starter-logging 也就是logback 日志实现方式 的依赖--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency>
-
-
-
下面是我遇见的其他问题
在完成上面操作后,还是不能排除 spring-boot-starter-logging 依赖项,通过 mvn dependency:tree 查看了依赖树,发现在: spring-boot-starter 依赖中也包含这这个依赖项,检查pom.xml文件发现没有这个依赖项,最后在父工程的pom.xml中发现这个依赖。