• 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并运行代码测试,这里就不一一演示了。

  • 相关阅读:
    idea spring boot启动项目上面有红色叉
    hibernate Criteria中多个or和and的用法 and ( or or)
    CAS Server 4.2.7(自定义密码验证) 部署
    Web应用系统集成CAS-rest指南
    用DBMS_REDEFINITION将普通表转换为分区表
    windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
    Oracle表增删分区的脚本
    libcassandra开发示例
    关于MongoDB API的两个小经验
    C/C++开发Cassandra的一些经验
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/12421153.html
Copyright © 2020-2023  润新知