commons-logging使用

芮化
2023-12-01

commons-logging

参考资料

前言

概述

实现原理

使用

1.使用commons-logging.properties指定Log实现类

2.使用log4j配合commons-logging

common-logging Q&A

Logger.getLogger()和LogFactory.getLog()的区别

总结


参考资料

commons-logging的使用简介:https://blog.csdn.net/backbug/article/details/78655664

官方文档:https://commons.apache.org/proper/commons-logging/guide.html

Logger.getLogger()和LogFactory.getLog()的区别:https://blog.csdn.net/z1616595/article/details/103706355

 

前言

        上篇讲过Log4j入门使用,这次就来介绍一下经常会伴随它一起出现的另一个jar包commons-logging。我在平常的工作和学习中,经常会看到Logger和LogFactory出现,乍一看他们好像是去获取日志,这不禁让我有疑问,这俩货到底有啥区别,从这个疑问,我开始了对commons-logging的探索和学习。

概述

        Jakarta Commons-logging(JCL)是apache提供的日志接口,提供了日志的简单实现和日志解耦功能。所谓解耦功能,就是开发者在开发时可以通过使用commons-logging,不指定具体的日志实现类,完成开发。日志具体使用类在运行时才会通过配置加载,从而实现日志解耦。

        commons-logging对众多logging(如Log4j或其他日志包)实现类进行封装,使用者可以通过Log接口使用日志功能,无需理会具体的日志实现细节。另外提供接口Log供开发者自定义logging。

实现原理

        JCL有两个基本的抽象类:Log(接口)和LogFactory(抽象类),Log是日志基础接口,所有commons-logging日志类都要实现该接口,LogFactory是用于生成Log的工厂类。默认的LogFactory采用以下顺序来决定使用哪个Log实现类(当第一个Log匹配时,停止查找):

        1.查找命名为org.apache.commons.logging.Log的配置属性,属性值为类名,可以使用java代码手动注入,不过一般使用更为方便的资源文件commons-logging.properties配置。在classpath下查找commons-logging.properties文件,找到则使用其定义的Log实现类,当有多个文件时,根据优先级使用第一个查找到的。

        2.查找命名为org.apache.commons.logging.Log的系统属性。

        3.如果classpath中有Log4J包,则使用相应的封装类Log4JLogger。

        4.如果应用是基于JDK1.4以上的版本实现的,则使用相应的封装类Jdk14Logger。

        5.使用默认简单的日志封装类SimpleLog。

使用

1.使用commons-logging.properties指定Log实现类

        首先,通过maven引入依赖,或者直接将jar包添加至lib下。

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

        新建commons-logging.properties文件,放在classpath下指定SimpleLog为Log实现类。

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

        代码中使用commons-logging。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CLASS {
    private Log log = LogFactory.getLog(CLASS.class);
    public static void main(String[] args) {
        log.debug("DEBUG ...");
        log.info("INFO ...");
        log.error("ERROR ...");
	}
}

2.使用log4j配合commons-logging

        首先,通过maven引入依赖,或者直接将jar包添加至lib下。

<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>

        配置简单的log4j配置,添加log4j.properties配置文件到classpath下:

log4j.rootLogger=DEBUG,console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] [%p] - %m%n

 

        这里不需要再配置commons-logging.properties,只需配置log4j.properties配置,实现log4j即可。然后在使用日志功能时,会LogFactory根据默认的查找机制,自动匹配Log4J,使用Log实现类org.apache.commons.logging.impl.Log4JLogger。

        代码中使用commons-logging,我们可以看到在引入依赖时候并没有使用到log4j的相关包,这里就是通过commons-logging对日志具体的实现进行封装。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CLASS {
    private Log log = LogFactory.getLog(CLASS.class);
    public static void main(String[] args) {
        log.debug("DEBUG ...");
        log.info("INFO ...");
        log.error("ERROR ...");
	}
}

        观察控制台即可得到输出信息。

2019-12-25 21:49:46,334 [main] [DEBUG] - DEBUG ...
2019-12-25 21:49:46,335 [main] [INFO] - INFO ...
2019-12-25 21:49:46,335 [main] [ERROR] - ERROR ...

commons-logging Q&A

        本节主要就我在使用commons-logging时候的疑问进行解答,也分享给大家。

Logger.getLogger()和LogFactory.getLog()的区别

        这是一个我刚接触commons-logging的疑问,也可能是很多初学者的问题。

        Logger是Log4j的一个工具类,我们在开发过程中,可以通过使用Logger来使用Log4j;LogFactory是commons-logging的工厂类,用来获取日志实现类Log,LogFactory具体使用哪个Log,在运行时方才进行加载。

        总结一下,第一点是jar包的不同,就是Logger是Log4j的日志类,而LogFactory是commons-logging的工厂类。第二点是使用时的差异,当我们使用Logger时,我们在开发时就知道使用的日志实现时Log4j,而当我们使用commons-logging时,只有在运行时,我们才能知道使用的日志实现类时什么。

        最后两者的作用其实是相同的,都是用来生成日志类,不过第一个Logger.getLogger()是得到的是org.apache.log4j.Logger,第二个LogFactory.getLog()得到的是org.apache.commons.logging.Log的实现类。

总结

        本来还有一个LogFactory.getLog()的两种用法要写在Q&A中,但是写完之后发现自己在这个对这个问题的回答应该是个不及格,为了不给大家一个错误的引导,我就没写了。有兴趣的小伙伴可以自行深入学习哦!虽然我使用过commons-logging,也研究过其配置加载顺序,但也只是局限于此,知其然不知其所以然,深入一点的东西就两眼一闭了。当我日常工作和学习中,每每遇到一些没有接触过的知识点想去查资料时,发现查出来的资料又有其他更深入的东西,如同俄罗斯套娃一般,但因为时间不足,就放弃了,真正想要整理时,又发现无从下笔,真是书到用时方恨少呀。在这给自己定一个小目标,希望接下来熟悉掌握日志的使用和原理,然后写一篇更深入的文章,不敢说精通,但求熟悉。

 类似资料: