大家好,我是十一郎。
最近公司接手了一个二次开发项目,由于使用的是Spring 4 的日志体系和内容,由于4/5版本的日志,跨度稍微有点大,有很多同事对此表示迷茫。于是特意写了这篇来说明这个问题,首先我们来看看Spring4 和Spring5的各自日志体系再做分析。
Spring4日志体系
构建spring4项目
采用java+注解的方式快速构建,pom中只引入spring-context包

运行下面的代码,可以看到有日志输出

找到打印日志的地方,debug模式下,查看输出日志的Log是什么log

可以看出是jdk14Logger,这个在JCL中说过,这个指的是JUL,也就是说在默认Spring日志体系下,采用的是JUL, 接下来,我们按照之前的方法引入log4j,debug运行上面的程序,再次查看日志类型:

而这次在增加log4j jar包和配置文件的情况下,Spring4有使用了log4j,这么像JCL呢,木错,让我们在idea中打开Spring4的日志依赖结构:

common-logging 这不就是JCL使用到的包吗,可以看出,Spring4使用的是原生的JCL,所以在有log4j的时候使用log4j打印日志, 没有的时候使用JUL打印日志。
那我们继续看看Spring5的日志体系。
Spring5日志体系
线上依赖结构图:

答题结构没变,只是原来common-logging ,换成了spring-jcl,看名字就知道是Spring自造的包,jcl,更是标注了,它使用的是JCL日志体系。
所以还是看源码吧。
按照之前的经验,我们只用debug找到Spring内部一个Log,看看他的产生方式和类型。这次我给大家找了AbstractApplicationContext里面找到产生Log的地方

进入这个方法的getLog()中,一直深入,不要怜惜spring,找到LogAdapter中的createLog()方法

可以看出来Spring5中对日志的生产,不在像原生JCL中那样使用一个数组,然后进行循环产生,这里用到的是Switch case,这个关键字段LogApi又是在哪一部分赋值的呢?看图

Duang ,没错是在静态代码块中赋的值,为了验证,我们准备用其中提到的log4j2验证(注意:log4j不行,因为这里的switch没有log4j选项),首先我们准备log4j2的配置文件


然后准备pom

结果有日志打印出来了

所以,在Spring5中,依然使用的是JCL,但是不是原生的,是经过改造的JCL,默认使用的是JUL,而原生JCL中默认使用的是log4j.
到了这一步,对于Spring中的日志体系,我们有了清晰明了的认知,面对升级的日志体系也能捋得清楚了。
没有捋清楚也没关系,可以再多看几遍,记得收藏+关注。我这里整理了一份大厂面试的资料,可以扫下方名片找小助手领取一下

本文探讨了Spring4和Spring5的日志体系差异。在Spring4中,默认使用JUL,当存在log4j时会切换到log4j。Spring5则使用改造过的JCL,即spring-jcl,但仍然默认使用JUL。通过源码分析,展示了Spring5如何根据环境选择日志实现,并提供了一个使用log4j2验证的例子。
2209

被折叠的 条评论
为什么被折叠?



