总目录:SpringBoot学习教程
(一)市面上有很多的日志框架JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j.等。
我们的应用中一般使用的是日志的门面(日志的抽象层)框架,但是程序中真正使用的是它的实现。
例如:我们使用SLF4J日志框架,但是具体的实现是Logback。
日志门面(日志的抽象层)
| 日志实现 |
SLF4J
| Logback |
在开发中,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法,然后具体方法再用日志实现类去完成。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
SLF4J官方中有一张图片:
正确的用法:
第二列:(SLF4J与logback绑定)我的应用程序是面向SLF4J编程,调用它的方法进行日志的记录。而在程序中我也导入了日志的实现(logback),从图中可以看出,我们虽然调用的是SLF4J接口,但是具体实现是logback,真正的将日志记录到文件。
第三列:(SLF4J与log4j绑定),因为log4j比较早,当初他就没有想到SLF4J这一回事,因为后面的不断拓展才出现了这个统一抽象层。所以我们还是按照这个原理,应用程序还是统一的调用这个抽象层,但是log4j出现的时候没有考虑SLF4J的出现,然后我们就在他俩中间加入一个适配层,这个适配层就相当于上面实现了sl4j的具体方法,而在方法中间正在记录的时候,他又调用下面的log4j中的方法。
深蓝颜色的是:都是实现
绿颜色的是:都是中间的适配层,用来适配一些本来不认识slf4j的实现框架。
日志的配置 :每个日志的框架都有自己的配置文件。使用slf4j之后,配置文件还是做成日志实现框架的配置文件。
例如:slf4j提供的是统一的接口,具体实现是logback,那配置文件就写logback的。
(三)遗留问题:
我们有一个A系统,里面使用的是(slf4j和logback)日志框架,但是这个系统还依赖spring,hibernate,mybaits等框架,而这些框架在底层也有可能用到了一些日志 ,而且还都不相同。spring中使用commons-logging记录的,hibernate用jboss-logging记录的,等等。那么,问题就出现了,这么多不统一的日志框架我们怎么办?
统一日志记录:我让别的框架也使用slf4j,替换他们原来框架。
官网文档又提供了一张图片进行解释说明:
第一列:我们这个应用程序面向的是slf4j编程,然后真正的实现我们用的是logback。
然而我们这个应用程序还依赖别的框架,而每个框架还用到了其他的日志框架,而我想的是,让这些框架都能够统一使用slf4
怎么办呢,我们使用一些包将他们替换。(偷天换日)这个替换包中的功能和原来的一样,原来里面有啥类,这个类里面还有。
上面说的可能有点乱,下面采用尚硅谷老师的话进行一个总结:
如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现;
(四)SpingBoot日志关系:
一开始项目中的依赖 spring-boot-starter-web:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web里面有这个spring-boot-starter依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.0.RELEASE</version>
<scope>compile</scope>
</dependency>
spring-boot-starter下面有spring-boot-starter-logging:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.0.0.RELEASE</version>
<scope>compile</scope>
</dependency>
总结:
1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录
2)、SpringBoot也把其他的日志都替换成了slf4j;
3)、中间包转换
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring‐core</artifactId>
<exclusions>
<exclusion>
<groupId>
commons‐logging
</groupId>
<artifactId>
commons‐logging
</artifactId>
</exclusion>
</exclusions>
</dependency>