spring5日志新特性详解

  • 前言

     大家都知道spring一直使用jcl作为日志框架,但是spring5在jcl的基础上自己做了优化,整理成了spring-jcl,接下来我就跟大家详细说一下spring5跟spring4的日志框架到底有何不同。

 

  • 正文

 首先在项目中引入spring4和log4j的依赖,发现打印出来的日志是log4j的日志。

    
      org.springframework
      spring-context
      4.3.14.RELEASE
    
    
      log4j
      log4j
      1.2.17
    

再把spring4的依赖换成spring5的,可以发现打印出来的日志居然是jul的,这是为什么呢?我们来看底层源码,在打印的日志中我们可以看到,日志是通过AbstractApplicationContext.prepareRefresh()方法打印出来的,我们进这个方法看看:

spring5日志新特性详解_第1张图片

spring5日志新特性详解_第2张图片

可以看到spring4是通过这个Log对象打印的日志的,查看这个Log对象可以看到它是jcl:

所以spring4在引入log4j依赖的话就会以log4j的形式打印日志,对于jcl不太明白的童鞋可以看我上一篇关于Java日志的文章 。

接下来我们再来看spring5的源码,同样的我们看AbstractApplicationContext.prepareRefresh()这个方法:

spring5日志新特性详解_第3张图片

同样的,我们看到方法并没有变化,唯一改变的就是Log对象的获得方式变了,我们继续看getLog(...)方法:

spring5日志新特性详解_第4张图片

可以看到spring在这个方法中做了switch操作, 看到这里大家肯定觉得,第一个判断的是log4j对象啊,为什么log4就没起作用呢?不着急,我们继续往下看:

spring5日志新特性详解_第5张图片

可以看到logApi默认的值是JUL,在这个静态代码块当中有对logApi进行赋值,可以看到这个并不是log4j而是log4j2, 所以当你引入log4j依赖的话,并不会起作用,而会使用默认的jul。

  •  总结

 spring4使用jcl,spring5使用的是spring-jcl,spring5在jcl基础上做了调整,不支持log4j,默认使用jcl去绑定jul来打印日志,如果要使用log4j,只能使用slf4j去绑定log4j。

你可能感兴趣的:(日志相关)