Java日志框架(第四章)

7 篇文章 0 订阅
2 篇文章 0 订阅

4.第四章JCL

4.1JCL简介

        JCL全称Jakarta Commons Logging,是Apache提供的一个通用日志API。

        用户可以自由选择第三方的日志组件作为日志实现,例如Log4j,或者JDK自带的JUL,common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。

        当然,common-logging内部有一个Simple Logger的简单日志实现,但是功能很弱,所以使用common-logging,通常都是配合着Log4j以及其他日志框架来使用。

        使用它的好处就是,代码依赖是common-logging而非Log4j的API,避免了和具体的日志API直接耦合,在必要时,可以更改日志实现的第三方库。

        JCL有两个基本的抽象类:

                Log: 日志记录器

                LogFactory: 日志工厂(负责创建Log实例)

4.2案例分析

        首先创建一个maven项目,引入所需的依赖

    <dependencies>
        <!-- 单元测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- jcl依赖 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        
    </dependencies>

        接下来进行测试,同样,我们选择jcl的Log类进行创建,通过jcl的LogFactory获取Log实例

        目前我们在项目中没有引入第三方的日志框架,例如Log4j,通过输出info日志信息,观察结果

        根据输出结果的日志格式,我们了解到在没有引入其他第三方日志框架的情况下,JCL默认使用JUL日志框架做日志的记录操作。接下来我们引入Log4j的依赖,继续进行测试

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

         通过测试结果,我们观察到,当我们集成了Log4j环境之后,JCL使用的变为Log4j来实现日志的记录操作,并且我们了解到,日志框架发生了变化,但是代码完全没有改变,以此便引出了日志门面技术所带来的好处:

        1.门面技术是面向接口开发的,不再依赖具体的实现类,减少代码的耦合性

        2.可以根据需求,灵活的切换日志框架

        3.统一的API,方便开发者学习和使用

       4. 统一的配置管理,便于项目日志的维护工作

        接下来,我们对JCL源码进行分析,首先进入到JCL的Log类中,我们发现Log其实是一个接口,并且有多个接口实现,其中有四个实现类如下:

         通过这四个实现类的内部实现我们了解到,Jdk13LumberjackLogger使用的是Jdk老版本的内置日志实现,Jdk14Logger使用的是JUL日志框架,Log4JLogger使用的是Log4j日志框架,SimpleLog则是JCL自带的日志实现

        接下来我们对LogFactory进行分析,我们发现LogFactory是一个抽象类,无法实例化,因此需要观察其实现类LogFactoryImpl,LogFactoryImpl类是真正加载日志实现使用的类

        我们进入到getLog()方法中, 发现getInstance()方法,继续进入,发现instance = this.newInstance(name);继续进入,发现instance = discoverLogImplementation(name);表示发现一个日志的实现,进入方法我们找到如下代码:

        遍历我们拥有的日志实现框架,遍历的对象为一个数组,这个数组的顺序是按照Log4JLogger,Jdk14Logger,Jdk13LumberjackLogger,SimpleLogger的顺序进行遍历,表示的是第一个要遍历的就是Log4j,如果有Log4j则执行该日志框架,如果没有,则遍历出来第二个使用Jdk14的JUL日志框架,以此类推,其中for循环内的代码表示帮我们创建Logger对象,方法中我们发现如下两行代码:

         代码中通过取得该类型的反射类型对象,使用反射的方式帮我们创建了Logger对象。

4.3总结

        1.根据原理分析了解JCL底层是通过一个数组的顺序变量来一次判断使用Log4j,JUL,Jdk老版本内置日志实现Jdk13,JCL内置日志实现SimpleLog中的哪一种。

        2.这样的设计也导致了新出现的日志实现框架如果想使用JCL进行加载,就需要修改JCL的源代码,实现Log接口,并将新日志框架添加到JCL日志加载数组中,因此JCL在2014年已经被Apache淘汰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值