Java日志门面技术 JCL

背景

在前面博文中,我们分别讲述了常用的2个日志框架:JUL(Java Util Logging)、Log4J。那么如何选择使用哪一个呢?

根据项目需求而定,在项目设计之初,功能比较单一简单,那么我们可以使用JUL日志框架,使用起来非常灵活,也不需要引入第三方依赖,随着我们项目升级,迭代维护,功能会越来越完善,简单的日志实现框架就不能满足我们的业务需求,那么就要进行日志升级!

如果我们从JUL日志实现框架切换为Log4j的话,代码会受到冲突影响,虽然Log4j在1.2以后,为了迎合JUL的设计思想,也把自己代码改成logger了,但它的日志级别和配置信息还是有一定的差异化,如果我们的日志代码有一万行,那么都要进行修改,这无疑是增加了很多工作量。

JCL的诞生

为了解决这个问题,apache组织就站出来了,它就将当时比较主流的日志实现框架,例如 JUL、Log4j 将代码统一成一套API,后期软件开发阶段,只需要关联这套统一的API,就可以操作某一个日志实现框架的日志记录了,代码无需发生改变。

以面向接口的方式,来操作具体的实现。一种解耦合的思想,这个技术就是:JCL

比如web应用需要进行日志记录的话,不再直接依赖log4j、jdk14等日志实现了,而是依赖JCL这套统一的接口API,它会帮助我们调用具体的日志实现。

在这里插入图片描述

JCL是什么?

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

JCL 有两个基本的抽象类:Log(基本记录器)和 LogFactory(负责创建Log实例)

快速入门

新建一个maven项目引入maven依赖,为了方便测试,同步也引入Junit

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
</dependencies>

编写测试用例

// 注意:jcl日志框架引入的是org.apache.commons.logging包类
public class Demo {
 
    // 入门案例
    @Test
    public void testQuick(){
        // 1.通过LogFactory获取日志记录器
        Log log = LogFactory.getLog(Demo.class);
 
        // 2.打印日志信息
        log.info("hello JCL");
 
    }
}

在这里插入图片描述

LogFactory 负责创建具体log实例,底层调用Log4j 或 JUL(Java util logging) ,具体调用哪个取决于引入了哪个组件,上述例子没有引入Log4j依赖,因此它底层用的是JUL日志框架。

引入Log4j依赖

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

再次运行
在这里插入图片描述

⚠️ warn警告: 找不到logger对象的appenders处理器,它希望我们设置并初始化一个系统配置信息

# 设置rootLogger的日志级别为trace,appender处理器类型为ConsoleAppender
log4j.rootLogger = trace,consoleAppender
# "log4j.appender." 是前缀规范设置参数,myAppender是我们自己定义的appender的名称
# 设置appender类型为ConsoleAppender:将日志输出到控制台
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
# 设置名为myAppender的appender处理器的layout日志格式化类型
log4j.appender.consoleAppender.layout = org.apache.log4j.SimpleLayout

再次运行成功

在这里插入图片描述

JCL原理

其内部主要通过LogFactory 日志工厂去加载具体的日志实现

通过LogFactory动态加载Log实现类

在这里插入图片描述

日志门面支持的日志实现数组

public class LogFactoryImpl extends LogFactory {
    .....
 
    private static final String[] classesToDiscover = new String[]. 
        {
         "org.apache.commons.logging.impl.Log4JLogger", 
         "org.apache.commons.logging.impl.Jdk14Logger", 
         "org.apache.commons.logging.impl.Jdk13LumberjackLogger", 
         "org.apache.commons.logging.impl.SimpleLog"
        };
 
    .....
 
}

日志工厂其内部有一个加载日志的数组,加载顺序是按照数组顺序来的,这也解释了为什么入门案例中引入了Log4J,JCL内部日志框架就从JUL切换至Log4J了。

具体实现代码

for(int i = 0; i < classesToDiscover.length && result == null; ++i) {
    result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
}

总结

JCL是通过一个日志数组顺序加载,日志数组中包含:JCL的内置日志实现SimpleLog、log4j JUL(Java Util Logging)以及Jdk老版本的内置日志实现。

设计缺陷

如果后期又出现了新的日志实现主流框架,如果你想加载的话,就需要修改JCL源代码,实现Log接口,放入到日志加载数组中,因此JCl已经在2014年被apache淘汰了。

原文链接:https://blog.csdn.net/w15558056319/article/details/123793600

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值