Spring Boot日志详解

在Spring Boot中默认采用了slf4j作为日志的抽象接口,Logback作为具体的日志实现。在谈Spring Boot之前,先了解下Slf4j作为抽象接口是如何适配其他的实现类。

首先来看下slf4j官网的图

Spring Boot日志详解_第1张图片

可以看到,slf4j可以直接适配的实现日志实现有logback,slf4j-simple和lf4j-nop,这些实现都出自slf4j作者之手,所有可想而知,就非常自然地可以与slf4j适配,而lo4j和jul作为出现在slf4j之前的日志实现,就需要一个适配层来适配sl4j,这里采用了适配器模式,适配层空实现了slf4j的所有方法,再在其中调用对应真正日志实现的方法。这样slf4j作为日志抽象层就能适配市面上所有的日志实现了。

但是我们知道Spring底层的日志是采用jcl作为日志抽象,另外一些依赖也有可能不用slf4j作为日志抽象,那么怎样解决这个问题呢,slf4j官方提出下面这种解决方法。

Spring Boot日志详解_第2张图片

 

以commons-logging为例,

  • 去掉commons-logging
  • 使用jcl-over-slf4j将commons-logging的底层日志输出切换到slf4j
  • 加入slf4j-api
  • 导入logback

其原理就是commons-logging通过jcl-over-slf4j来选择slf4j作为底层的日志输出对象,而slf4j又选择logback来作为底层的日志输出对象,看似原来依赖的还是commons-logging,但其实已经转移为其他的抽象日志了。

Spring Boot也采用了这种方法,看下图pom依赖表

Spring Boot日志详解_第3张图片

从上图可以看出,Spring Boot通过jul-to-slf4j.jar去适配了JUL日志框架,通过log4j-to-slf4j.jar去适配了log4j日志框架.

以log4j-to-slf4j为例

Spring Boot日志详解_第4张图片

其中的类都是有关SLF4J相关的类,起到转换为SLF4J的作用。

 

总结

SpringBoot能自动适配所有的日志,其底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要 把这个框架依赖的日志框架排除掉即可,因为SpringBoot会通过自己的jar去替代。

你可能感兴趣的:(Spring,Boot)