-
前言
大家都知道spring一直使用jcl作为日志框架,但是spring5在jcl的基础上自己做了优化,整理成了spring-jcl,接下来我就跟大家详细说一下spring5跟spring4的日志框架到底有何不同。
-
正文
首先在项目中引入spring4和log4j的依赖,发现打印出来的日志是log4j的日志。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
再把spring4的依赖换成spring5的,可以发现打印出来的日志居然是jul的,这是为什么呢?我们来看底层源码,在打印的日志中我们可以看到,日志是通过AbstractApplicationContext.prepareRefresh()方法打印出来的,我们进这个方法看看:
可以看到spring4是通过这个Log对象打印的日志的,查看这个Log对象可以看到它是jcl:
所以spring4在引入log4j依赖的话就会以log4j的形式打印日志,对于jcl不太明白的童鞋可以看我上一篇关于Java日志的文章 。
接下来我们再来看spring5的源码,同样的我们看AbstractApplicationContext.prepareRefresh()这个方法:
同样的,我们看到方法并没有变化,唯一改变的就是Log对象的获得方式变了,我们继续看getLog(...)方法:
可以看到spring在这个方法中做了switch操作, 看到这里大家肯定觉得,第一个判断的是log4j对象啊,为什么log4就没起作用呢?不着急,我们继续往下看:
可以看到logApi默认的值是JUL,在这个静态代码块当中有对logApi进行赋值,可以看到这个并不是log4j而是log4j2, 所以当你引入log4j依赖的话,并不会起作用,而会使用默认的jul。
-
总结
spring4使用jcl,spring5使用的是spring-jcl,spring5在jcl基础上做了调整,不支持log4j,默认使用jcl去绑定jul来打印日志,如果要使用log4j,只能使用slf4j去绑定log4j。