在进行 Java 开发时,一般咱们会选择 Slf4j 做为日志门面,但日志实现却不尽相同。若是系统运行中同时存在多个日志实现,就会出现相似下图的 Warning。web
咱们知道 SpringBoot 默认使用的日志实现是 Logback,所以咱们尝试在项目中引入 Log4j 的依赖时,就复现了上图的报错。spring
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
复制代码
上图报错告知咱们存在多个 SLF4J bingdings,分别位于 logback 和 log4j 包中,有两个 StaticLoggerBinder。编程
咱们知道使用 Slf4j ,须要 LoggerFactory.getLogger() 方法获取实例。markdown
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final Logger logs = LoggerFactory.getLogger(xxx.class);
复制代码
咱们就能够经过这个做为入口,去看看源码的实现。以下图所示,我标注了须要关注的核心代码。框架
解决思路就是将你不想要的日志实现从依赖包中排除掉便可,经过 IDEA 提供的 Diagrams 可以很是方便的查看项目中的依赖关系。spring-boot
打开项目的 POM 文件,右键选择 Diagrams -> Show Dependenciesspa
假设咱们想要排除 logback 依赖,使用 log4j。Ctrl + F 搜索 logback,能够找到引用该依赖的树形结构。日志
点击窗口左上角的下图中的这个图标,能够只看当前选中的这个依赖的关系。code
选中后效果以下:orm
如上图所示,logback 由 spring-boot-starter-logging 引入,最顶层是由 spring-boot-starter-web 和 spring-boot-starter-test 引入。
咱们尝试在 spring-boot-starter-web 中排除该依赖,应该就能够了。若是排出后从新搜索仍然存在 logback 依赖,则重复执行排除的操做。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>`
复制代码
日志框架冲突特别对于新手来讲处理起来比较头疼,由于涉及到了日志接口和日志实现。
咱们推崇的应该是面向接口编程,所以咱们大到开源项目,小到公司的公共 jar 包,应当合理利用 Maven 的传递机制。具体的日志实现不该该传递出去,避免影响到调用的下游方。
<optional>true</optional>`
复制代码