相信很多小伙伴在工作或开发中都会或多或少遇到日志冲突的问题,比如:
代码中明明打印了日志但是却没有出现?
日志文件中有打日志?但是控制台没有?
因为日志冲突,项目直接启动报错?
此时你的心里可能会奔腾一些词语出来
最可能的原因就是我们的项目引入了很多的第三方依赖,中间件,他们使用不同的日志框架,导致项目日志冲突
首先要引入一些必备的前置知识.
所以,一般都推荐使用 日志规范+实现框架 去打印, 在打印日志的时候调用日志规范中的接口方法,这样即使实现框架需要切换,改动也很小.
知道了一些必备的理论知识,现在来讲一讲日志依赖,因为真的种类太多了,又不知道引入有什么作用,就太难受了.
就是单纯引入Slf4j的api方法
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
slf4j-log4j12就是桥接器,为什么要有这个包呢?其实是因为slf4j和log4j并不兼容,需要在slf4j和log4j之间进行过渡和封装,只有引入了这个包,才能利用slf4j的接口调用log4j的实现
除了这个桥接包,还有很多的slf4j的桥接包,这里小总结一下,作用和slf4j-log4j12的都差不多.
其中针对于于logback日志框架时,并没有针对的桥接器,这是因为logback与slf4j是一个作者所写,在logback中直接实现了slf4j的SPI机制。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
这个逆转包可以使原来log4j的代码保持不变,使用slf4j接口进行输出.
举个例子:
有一些老项目中有可能直接使用log4j进行日志输出,现在我们想优化这个项目,将其改为slf4j作为门面,logback作为具体实现去输出日志, 那我们就可以引入log4j-over-slf4j这个包,它可以让你在不修改原有log4j代码的情况下,统一全部使用logback的日志格式进行输出.因为它会把原来log4j的输出转换成使用slf4j接口进行输出.
除了这个逆转包,还有其他一些常用的逆转包,如下:
正常应该需要引入以下三个依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
但是slf4j-log4j12依赖会自动引入其他两个包,所以,我们只需要单独引入这个包就可以达到效果
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
还需要注意要加上对应的配置文件,否则要报错
只需要引入logback的依赖即可,它不需要桥接包
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!--mvn加载有优先级,这个转换依赖最好放到前面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!--原有的log4j的依赖可以删除,这里注释掉了-->
<!-- <dependency>-->
<!-- <groupId>log4j</groupId>-->
<!-- <artifactId>log4j</artifactId>-->
<!-- <version>1.2.17</version>-->
<!-- </dependency>-->
日志冲突主要分为两个方面,一个是有明显的错误日志,控制台可以看到,这个时候首先要明白报错信息想表达的是什么意思,根据提示去进行优化,第二种是没有明显的错误日志,但是有些日志没有正常打印,这个时候就需要主动去排除依赖,查看是哪里冲突.
其实最主要的思想就是:
删除不必要的日志依赖
统一项目的日志门面/规范和实现
这里引用一个他人总结的依赖转换图.可以参考
今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.