日志门面介绍和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/

发表评论

电子邮件地址不会被公开。