在Spring Boot中默认采用了slf4j作为日志的抽象接口,Logback作为具体的日志实现。在谈Spring Boot之前,先了解下Slf4j作为抽象接口是如何适配其他的实现类。
首先来看下slf4j官网的图
可以看到,slf4j可以直接适配的实现日志实现有logback,slf4j-simple和lf4j-nop,这些实现都出自slf4j作者之手,所有可想而知,就非常自然地可以与slf4j适配,而lo4j和jul作为出现在slf4j之前的日志实现,就需要一个适配层来适配sl4j,这里采用了适配器模式,适配层空实现了slf4j的所有方法,再在其中调用对应真正日志实现的方法。这样slf4j作为日志抽象层就能适配市面上所有的日志实现了。
但是我们知道Spring底层的日志是采用jcl作为日志抽象,另外一些依赖也有可能不用slf4j作为日志抽象,那么怎样解决这个问题呢,slf4j官方提出下面这种解决方法。
以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通过jul-to-slf4j.jar去适配了JUL日志框架,通过log4j-to-slf4j.jar去适配了log4j日志框架.
以log4j-to-slf4j为例
其中的类都是有关SLF4J相关的类,起到转换为SLF4J的作用。
总结
SpringBoot能自动适配所有的日志,其底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要 把这个框架依赖的日志框架排除掉即可,因为SpringBoot会通过自己的jar去替代。