Java日志介紹(5)-commons-logging


Jakarta Commons Logging(JCL) 提供了一個簡單的日志抽象,允許開發人員使用特定的日志實現。JCL可以使用其他的日志實現,包括Log4J、Avalon LogKit(Avalon的日志框架)、JDK logging(JUL)。本文主要介紹JCL的簡單使用方法,文中所使用到的軟件版本:Java 1.8.0_191、commons-logging 1.2。

1、配置

JCL能夠在初始化期間自動查找配置文件進行配置;按照優先級查找直到找到,優先級如下:

1.在classpath下尋找配置文件commons-logging.properties,並使用文件中org.apache.commons.logging.Log屬性定義的Log實現類
2.查找系統環境變量org.apache.commons.logging.Log對應的Log實現類
3.查看classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日志實現類(org.apache.commons.logging.impl.Log4JLogger)
4.使用JDK自身的日志實現類(JDK1.4以后才有日志實現類)(org.apache.commons.logging.impl.Jdk14Logger)
5.使用commons-logging自己提供的一個簡單的日志實現類SimpleLog(org.apache.commons.logging.impl.SimpleLog)

2、spring-jcl

JCL與log4j及JDK logging(JUL)可以很好的配合使用;如果要使用logback、log4j2等新的日志框架就需要使用適配器。spring提供一個適配器spring-jcl:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jcl</artifactId>
  <version>5.2.4.RELEASE</version>
</dependency>

該適配器使用日志框架的優先級如下:

1.查看classpath中是否有log4j2的包;如果有,再查找是否有slf4j及log4j-to-slf4j的包,如果都有則使用slf4j,否則使用log4j2
2.查看classpath中是否有slf4j的包,如果有則使用slf4j
3.以上都沒有使用JDK logging

具體邏輯可以查看源碼org.apache.commons.logging.LogAdapter中的靜態模塊:

private static final String LOG4J_SPI = "org.apache.logging.log4j.spi.ExtendedLogger";

private static final String LOG4J_SLF4J_PROVIDER = "org.apache.logging.slf4j.SLF4JProvider";

private static final String SLF4J_SPI = "org.slf4j.spi.LocationAwareLogger";

private static final String SLF4J_API = "org.slf4j.Logger";


private static final LogApi logApi;

static {
    if (isPresent(LOG4J_SPI)) {
        if (isPresent(LOG4J_SLF4J_PROVIDER) && isPresent(SLF4J_SPI)) {
            // log4j-to-slf4j bridge -> we'll rather go with the SLF4J SPI;
            // however, we still prefer Log4j over the plain SLF4J API since
            // the latter does not have location awareness support.
            logApi = LogApi.SLF4J_LAL;
        }
        else {
            // Use Log4j 2.x directly, including location awareness support
            logApi = LogApi.LOG4J;
        }
    }
    else if (isPresent(SLF4J_SPI)) {
        // Full SLF4J SPI including location awareness support
        logApi = LogApi.SLF4J_LAL;
    }
    else if (isPresent(SLF4J_API)) {
        // Minimal SLF4J API without location awareness support
        logApi = LogApi.SLF4J;
    }
    else {
        // java.util.logging as default
        logApi = LogApi.JUL;
    }
}

如果classpath中同時使用了commons-logging和spring-jcl,會優先使用spring-jcl。

3、與SLF4J配合

3.1、commons-logging轉為SLF4j

把commons-logging的日志轉換為slf4j輸出,用jcl-over-slf4j替換commons-logging的jar包。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.30</version>
</dependency>

3.2、SLF4j綁定commons-logging

slf4j使用commons-logging來輸出日志;引入slf4j-jcl的jar包即可。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jcl</artifactId>
  <version>1.7.30</version>
</dependency>

注:jcl-over-slf4j和slf4j-jcl不能同時使用,否則會導致日志事件在SLF4J和jcl之間死循環。

4、實際使用

4.1、配置文件commons-logging.properties

該文件放到src或src/main/resources(spring boot工程)下即可。

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

4.2、代碼例子

package com.inspur.demo.log;

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

/**
 * commons-logging使用示例
 */
public class CommonsLoggingCase {

    public static void main(String[] args) {
        Log log = LogFactory.getLog(CommonsLoggingCase.class);
        System.out.println(log.getClass());
        log.debug("This is debug message.");
        log.warn("This is warn message.");
        for (int i = 0; i < 100; i++) {
            log.info("This is info message:" + i);
        }
    }
}

1、引入commons-logging、log4j的jar包,並使用log4j.properties來配置log4j,運行代碼可以看到日志格式跟log4j.properties中配置的一致。log4j的配置可以參考:Java日志介紹(2)-Log4j

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

2、引入spring-jcl、log4j2的jar包,並刪除commons-logging的jar(也可不刪,優先使用spring-jcl),使用log4j2.xml來配置log4j2,運行代碼可以看到日志格式跟log4j2.xml中配置的一致。log4j2的配置可以參考:Java日志介紹(4)-Log4j2

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.12.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jcl</artifactId>
    <version>5.2.1.RELEASE</version>
</dependency>

 

如果要使用其他日志框架,可以自行加入相關的jar並運行代碼測試,這里就不一一演示了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM