天天看点

Java日志框架(三):JCL简介使用原理

JCL

  • 简介
    • 官方网址
    • 手册地址
  • 使用
    • maven依赖
    • java使用
  • 原理
    • Log类的实现
    • 实现流程
    • LogFactory

简介

JCL(Jakarta Commons Logging)

是Apache提供的一个通用日志API。

它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具: Log4j, Jdk自带的日志(JUL), SimpleLog(JCL自己实现的日志实现类)

官方网址

http://commons.apache.org/proper/commons-logging/index.html

手册地址

http://commons.apache.org/proper/commons-logging/guide.html

使用

maven依赖

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

java使用

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Log log = LogFactory.getLog(JclDemo.class);
log.info("test start ");

           

原理

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

Log类的实现

Java日志框架(三):JCL简介使用原理

实现流程

当commons-logging.jar被加入到 CLASSPATH之后,它会心可能合理地猜测你喜欢的日志工具,然后进行自我设置,用户根本不需要做任何设置。默认的LogFactory是按照下列的 步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):

  1. 寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值
  2. 寻找系统中属性中名叫org.apache.commons.logging.Log的值
  3. 如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
  4. 如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
  5. 使用简易日志包装类(SimpleLog)

LogFactory

LogFactory

的实现类

org.apache.commons.logging.impl.LogFactoryImpl

, 用于选择哪个日志实现方式

/**
     * The names of classes that will be tried (in order) as logging
     * adapters. Each class is expected to implement the Log interface,
     * and to throw NoClassDefFound or ExceptionInInitializerError when
     * loaded if the underlying logging library is not available. Any
     * other error indicates that the underlying logging library is available
     * but broken/unusable for some reason.
     */
    private static final String[] classesToDiscover = {
            "org.apache.commons.logging.impl.Log4JLogger",
            "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);
        }

           

在上面4个实现类中选择一个, 优先

log4j

, 然后是

jul(org.apache.commons.logging.impl.Jdk14Logger)

如果pom引入了

log4j

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

会优先使用

log4j

,

如果没引入实现类, 则使用

jul(org.apache.commons.logging.impl.Jdk14Logger)