日志门面介绍和JCL使用

日志门面概述

之前有写过Java日志框架JUL和Log4j介绍,可以对比发现它们之间的使用还是有一些区别的,比如有一些类名是不同的、日志的输出级别也不完全一致。

那么实际上是增大了日志框架与程序的耦合性,使得难以更换日志框架。
甚至会造成一些优秀的框架强制性依赖某一个具体的日志实现类,为了解决这个问题,日志门面技术就诞生了。

日志门面实质上就是提供了一套通用的日志API技术,和JDBC的思想类似,使用日志门面,就可以轻松地更换日志实现。

我们为什么要使用日志门面:
1. 面向接口开发,不再依赖具体的实现类减少代码的耦合
2. 项目通过导入不同的日志实现类,可以灵活的切换日志框架
3. 统一API,方便开发者学习和使用
4. 统一配置便于项目日志的管理

常见的日志门面:JCL、slf4j

JCL

JCL介绍

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

它是为“所有的Java日志实现”提供一个统一的接口,它自身也提供一个日志的实现,但是功能非常常弱
(SimpleLog)。所以一般不会单独使用它。他允许开发人员使用不同的具体日志实现工具:Log4j、jdk自带的日志(JUL)。

JCL使用

maven依赖:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

如果要使用log4j还需加上log4j的依赖

核心类:

  • Log:日志记录器,用于写日志
  • LogFactory:日志记录器的工厂类,用于获取日志记录器。

JCL的日志级别:

  • trace
  • debug
  • info
  • warn
  • error
  • fatal

可以看出和log4j的日志级别一致,但它把JUL的日志级别也适配到了这套日志级别上。

对于配置文件,如果使用JUL就添加JUL的配置文件,如果使用log4j就添加Log4j的配置文件。

JCL默认会根据如下顺序查找日志的实现类:

private static final String[] classesToDiscover = {
        LOGGING_IMPL_LOG4J_LOGGER,
        "org.apache.commons.logging.impl.Jdk14Logger",
        "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
        "org.apache.commons.logging.impl.SimpleLog"
};

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

其中LOGGING_IMPL_LOG4J_LOGGER代表的是log4j的org.apache.commons.logging.impl.Log4JLogger,可以看到JCL支持的日志实现有:

  • log4j
  • jdk1.4的日志(JUL)
  • jdk1.3前的LumberjackLogger(已经淘汰)
  • JCL自带的SimpleLog

如果用户不指定使用哪个日志实现类,JCL会按这个顺序查找,使用最先找到的实现类。

如果需要指定,还需要添加一个配置文件commons-logging.properties在类路径下:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

此后就可以使用了:

Log log = LogFactory.getLog(JCLTest.class);
log.info("hello JCL");

JCL的问题

JCL的问题是,当初设计的时候只考虑到了在当时比较主流的日志框架log4j、JUL,也只支持这几个日志框架,导致后面如果出现了更强大的日志框架,比如说logback出现后,如果需要使用logback,JCL需要通过修改代码的方式来适配,当然这会造成很大的麻烦。

JCL获取日志工厂的过程中使用了classLoader来寻找日志工厂实现,进而导致了其他组件,如若使用自己的classloader,则不能获取具体的日志工厂对象,则导致启动失败。(即无法动态查找)

于是不久commons-logging就退出了人们的视线,更好的日志门面技术slf4j诞生以取代它的位置。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e6%97%a5%e5%bf%97%e9%97%a8%e9%9d%a2%e4%bb%8b%e7%bb%8d%e5%92%8cjcl%e4%bd%bf%e7%94%a8/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年3月9日
下一篇 2020年3月9日

相关推荐

  • Random在多线程下的问题以及ThreadLocalRandom类分析

    Ramdom在多线程环境下的问题 首先我们看一下Random类的nextInt源码: //产生[0,bound)的随机数 public int nextInt(int bound)…

    Java 2020年5月18日
    0540
  • 深入理解java虚拟机第三版读书笔记01

    做笔记之前的感言 谈到《深入理解java虚拟机》,在业内可太有名了,是国内的一位大神写的一本关于java虚拟机的畅销书,基本上对java稍有深入的程序员都听说过这本书。不过遗憾的是…

    2020年1月4日
    0280
  • Java8避免空指针异常Optional类的使用

    最近都是一天写一篇算法题解,好久没有写过博客了,不知道写啥了而且快到期末考试了。。 今天介绍一个Java8的特性:Optional类,这个类我平时也不咋用,今天来研究一下。 Opt…

    Java 2020年6月3日
    0660
  • Java中的四种内部类

    我发现最近真是越来越没有东西写了。。。不可能天天学习新知识啊,最近在复习阶段了,复习的东西大多数是博客里写过的/(ㄒoㄒ)/ 复习Java基础的时候认真看了一下Java的内部类,这…

    Java 2020年5月23日
    0100
  • 深入理解java虚拟机第三版读书笔记06

    附: Java虚拟机规范-Class文件格式:JDK8 Java虚拟机规范-Class文件格式:JDK13 以下是第六章 类文件结构的内容 Class类文件的结构 Class文件是…

    Java 2020年1月18日
    0180
  • JavaIO-缓冲流与转换流

    缓冲流 概述 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,BufferedO…

    Java 2020年2月4日
    0120
  • HashMap源码分析

    HashMap是java中非常常见的一个数据结构,在这篇文章里,我依然以Map中的操作为导向来循序渐进研究HashMap中的源码,阅读这篇文章需要的前置知识有: 弱平衡的二叉查找树…

    Java 2020年2月12日
    0220
  • CopyOnWriteArrayList源码分析

    总结 总结放前面防止太长不看 CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的List实现。 CopyOnWriteArrayList内部通过volat…

    Java 2020年2月15日
    0190
  • HashSet源码分析

    Set家族一览: HashSet简介 Set是Collection三大接口其中之一,意为集合,且元素不能重复。Set接口中的方法和Collection中的方法完全一致,只是起到一个…

    2019年12月2日
    0200
  • Java中的File类以及IO流

    File 类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 构造方法 public File(String path…

    Java 2020年2月4日
    0150

发表回复

登录后才能评论