SpringBoot日志框架和日志加载原理分析

日志框架的选择

目前市面上有五花八门的日志框架,让我们来看看市面上有什么框架

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j….

日志门面  (日志的抽象层) 日志实现
JCL(Jakarta  Commons Logging)    SLF4j(Simple  Logging Facade for Java)    jboss-logging Log4j  JUL(java.util.logging)  Log4j2  Logback

Log4J和Logback是同一公司研发产品,因为认为Log4J的部分实现和性能上存在瓶颈,所以后来作者又研发了Logback

Log4J2是Log4J的升级版,但是研发是由Apache基金会在Log4J的基础上进行研发,改进
左边选一个门面(抽象层)、右边来选一个实现;

日志门面:  SLF4J;

日志实现:Logback;SpringBoot使用的是SLF4j和logback,底层是Spring框架,Spring框架默认是用JCL,这样就存在一个问题:SpringBoot日志如何做统一处理?这里后面会解答在这里,我们需要先解释一下日志门面和日志实现的专业名词

日志门面:

相当于日志的抽象层,这个日志只提供日志的一些标准接口和抽象方法,但是方法里面并没有实现具体逻辑

日志实现:

实现对应日志门面的接口和方法

SLF4J实现框架日志

首先我们进入SLF4J的官方网站,我们可以看到一张图解释了SLF4J如何对日志进行管理

专业名词解释:

abstract logging api:日志的抽象接口api

native implementation of slf4j-api:实现slf4j的api

adaptation layer:中间适配层,用来识别本来不认识slf4J框架JAR包的日志实现

non-native implementation of slf4j-api:继承slf4j的api框架实现层

x.jar:统一的抽象层JAR

x.jar[红色框]:实现了slf4j的jar

图片解释:

首先我们来看第一列:SLF4J是日志门面,依赖了slf4j-api的jar,但是我们看到下面是/dev/null 这是没有日志实现的状况

slf4j和日志实现的logback,第二列表示日志门面和日志实现的一一对应关系,通过slf4j实现logback,其中logback依赖图中2个jar包

如果用slf4j作为日志门面,log4j作为日志实现。中间我们可以看到有个适配层,相当于适配层上面实现了log4j的具体方法,里面真正进行日志记录的时候,又调用了log4j的api,其实这里就很像设计模式中的装饰者模式。

slf4j作为日志门面,java.util.logging作为日志实现原理同上,面向slf4j编程

slf4j也存在着简单的默认实现,简单的默认实现可以通过slf4j-simple.jar进行简单日志实现

slf4j导入到没有什么实现的jar包:slf4j-nop.jar,导出到空位置的实现

总结:每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件