JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。
1、基本原理
JCL这个日志框架跟Log4J,Java Logging API等日志框架不同。JCL采用了设计模式中的“适配器模式”,它对外提供统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,比如Log4J,Java Logging API等。
在JCL中对外有两个统一的接口,分别是Log和LogFactory。Log的继承体系如图1:
图1
LogFactory的继承体系如图2:
图2
Log4JLogger,Jdk14Logger等是适配类。
在执行以下Java代码语句的时候,经历了哪些步骤?
- Log log = LogFactory.getLog(Main.class);
- log.error("Hello World");
- for(int i = 0; i < classesToDiscover.length && result == null; ++i)
- {
- result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
- }
其中classesToDiscover的值如图3所示:
图3
二、基本原理扩展
1、本质上说,NoOpLog和SimpleLog不是适配器类,因为它们自身实现日志操作功能,而不是委托给其他日志框架。
2、关于JCL有两个包,分别是:commons-logging:commons-logging:1.1和commons-logging:commons-logging-api:1.1
这两者的主要差别在于前者比后者拥有更多的适配器类
前者中的适配器体系见图1
后者中的适配器体系见图4
图4
3、在commons-logging:commons-logging:1.1和commons-logging:commons-logging-api:1.1的pom.xml文件中,可以发现它们有对具体日志框架的依赖,比如在commons-logging:commons-logging:1.1的pom.xml中有如下片段:
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.12</version>
- </dependency>
- <dependency>
- <groupId>avalon-framework</groupId>
- <artifactId>avalon-framework</artifactId>
- <version>4.1.3</version>
- </dependency>
即包含有对Log4J和avalon-framework(也是一个具体的日志框架)的依赖。其实想想也是如此,因为JCL中含有Log4JLogger,Jdk14Logger等适配器类,在这些适配器类中含有对对应的具体的日志框架的依赖,比如在Log4JLogger类中,有如下片段:
- package org.apache.commons.logging.impl;
-
- import java.io.Serializable;
- import org.apache.commons.logging.Log;
- import org.apache.log4j.Logger;
- import org.apache.log4j.Priority;
-
- public class Log4JLogger implements Log, Serializable {}
以上这点表明,在项目中,我们只要包含了对commons-logging:commons-logging:1.1或者commons-logging:commons-logging-api:1.1的依赖,就会包含所有对它们所支持的具体日志框架的依赖。因而在JCL运行时动态查找具体日志框架的过程中,能够找到所有所支持的具体日志框架,根据具体的查找算法,选定某一个返回。- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
那么显式指定使用Log4J这个具体日志框架,然后也生成"org.apache.commons.logging.impl.Log4JLogger"的一个实例
1、JCL+Log4J
1.1、项目中的pom.xml配置
- <dependencies>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- </dependencies>
1.2、commons-logging.properties和log4j.properties两个文件的内容
"commons-logging.properties"文件内容如下:
org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger
"log4j.properties"文件内容如下:
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
-
- public class Main {
- public static void main(String[] args) {
- Log log = LogFactory.getLog(Main.class);
- log.error("Hello World");
- System.out.println(log.getClass());
- }
- }
1.4、输出结果
如图5
图5
2、JCL+Log4J
2.1、项目中的pom.xml配置
- <dependencies>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- </dependencies>
2.2、commons-logging.properties和log4j.properties两个文件的内容
"commons-logging.properties"文件内容如下:
org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger
2.3、Java代码
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
-
- public class Main {
- public static void main(String[] args) {
- Log log = LogFactory.getLog(Main.class);
- log.error("Hello World");
- System.out.println(log.getClass());
- }
- }
2.4、输出结果
如图6
图6
3、JCL+Java Logging API
3.1、项目中的pom.xml配置
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1</version>
- </dependency>
- <!--对JDK的依赖无需在pom.xml中配置-->
"commons-logging.properties"文件内容如下:
org.apache.commons.logging.Log = org.apache.commons.logging.impl.Jdk14Logger
"logging.properties"文件是Java Logging API默认的配置文件名称,默认路径是JDK_HOME/jre/lib/logging.properties
3.3、Java代码
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
-
- public class Main {
- public static void main(String[] args) {
- Log log = LogFactory.getLog(Main.class);
- log.error("Hello World");
- System.out.println(log.getClass());
- }
- }
3.4、输出结果
如图7
图7
3、Spring项目中就选用了JCL框架
参考文献:
[1]http://commons.apache.org/proper/commons-logging/guide.html
[2]http://www.javapractices.com/topic/TopicAction.do?Id=143
原文地址:https://blog.csdn.net/DSLZTX/article/details/47132329原文:https://www.cnblogs.com/jpfss/p/11044229.html