>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 20599 个阅读者 刷新本主题
 * 贴子主题:  Spring5新特性之日志体系 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-03-09 13:28:04     消息  查看  搜索  好友  邮件  复制  引用

                                                                                                

Spring5新特性之日志体系

日志系统对于各大主流框架或是自己的应用中都是不可或缺的重要组成部分,最近比较关注spring,所以就来分析下spring的日志系统以及spring4和spring5的日志有哪些区别。

     对于各种日志技术,可参见我的另一篇文章:https://blog.csdn.net/baomw/article/details/84526738

1,我们先从spring4和5的核心包context包的依赖关系,来看看其涉及的日志依赖包

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

<spring4依赖关系图>

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

<spring5依赖关系图>

     从上面的依赖关系不难看出,我们spring4所依赖的jar就是我们的jcl,而spring5则依赖了一个叫spring-jcl的包,至于这个spring-jcl到底是什么,是不是就是我们的jcl呢,我们可以通过例子来看看,这个到底是不是我们jcl的实现。

     2,我们知道,jcl打印日志有log4j时通过log4j输出日志,没有则通过jul输出日志。

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

通过上图,可以知道,当加了log4j的时候,通过log4j来输出日志,没加则通过jul来输出日志,可见spring4引入的jcl就是我们原生的jcl(原理参见我的另一篇文章,上有连接。)

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

可以看到,spring5就算我加了log4j的jar,依然还是通过jul来打印的日志,说明spring-jcl至少不是我们所知道的jcl,那么spring-jcl到底是什么呢?我们可以断点一下,看看拿到的log对象是什么,然后再看看log对象是怎么产生的即可。

     2,可以看到,get到的log对象是jul

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小    

static {
        logApi = LogFactory.LogApi.JUL;
        ClassLoader cl = LogFactory.class.getClassLoader();

        try {
            cl.loadClass("org.apache.logging.log4j.spi.ExtendedLogger");
            logApi = LogFactory.LogApi.LOG4J;
        } catch (ClassNotFoundException var6) {
            try {
                cl.loadClass("org.slf4j.spi.LocationAwareLogger");
                logApi = LogFactory.LogApi.SLF4J_LAL;
            } catch (ClassNotFoundException var5) {
                try {
                    cl.loadClass("org.slf4j.Logger");
                    logApi = LogFactory.LogApi.SLF4J;
                } catch (ClassNotFoundException var4) {
                    ;
                }
            }
        }
    }

上图及代码为spring-jcl的logFactory中的两处核心代码:

首先在初始化logFactory的时候,会去执行一个static的代码块,代码也比较简单,主要就是设置我们的logApi,默认是jul,然后依次用log4j2,slf4j-LAL,slf4j去反射判断是否存在对应依赖,如果有则设置logApi为对应值,否则进入catch中继续判断。

然后再getlog的时候,则根据logApi去获取log对象,代码也比较容易了,就是个switch-case,默认是我们的jul来实现。

     结合我上篇文章的jcl的实现,发现还是有很大区别的,jcl是封装了一个静态数组,然后依次循环遍历反射,成功则返回对应实现。

     原来在spring5的时候,他将jcl给改了,也就是我们的spring-jcl(毕竟大厂,牛逼),然后默认采用了jul来做日志输出了。同时呢还支持slf4j,有着更好的扩展性和兼容性。

     好了,关于spring5的日志就说到这里了。谢谢大家

                                                                                                                
----------------------------
原文链接:https://blog.csdn.net/baomw/article/details/84641753

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-10 12:51:05 重新编辑]
  Java面向对象编程-->流程控制
  JavaWeb开发-->使用Session(Ⅰ)
  JSP与Hibernate开发-->映射组成关系
  Java网络编程-->安全网络通信
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->组合(Composition)API
  Maven 安装及环境配置
  NIO的几道常见面试题
  循序渐进,阿里架构师看完都赞叹的Redis分布式锁原理分析
  WebFlux 响应式编程初体验
  微服务的拆分方式
  Spring MVC SSE服务器端推送
  @Resource注解的用法
  RESTful架构和RESTful API设计总结
  kubernetes 中的资源
  Zabbix后端存储ES的优化实践
  3分钟让你明白JSON是什么
  spring源码阅读环境(几分钟下载包)
  Spring配置日志
  Spring MVC:切面的应用
  Java核心库实现AOP过程
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 nihaota 
  
威望: 0
级别: 新手上路
魅力: 1315
经验: 1315
现金: 2944
发文章数: 243
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


讨债公司
发文章时间 2022-10-28 19:56:55
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。