JCL,全称为"Jakarta Commons Logging",是Apache提供的一个通用日志API。
JCL采用了设计模式中的“适配器模式”,它是为“所有的Java日志实现”提供的一个统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,它自身也提供一个日志的实现,但是功能非常弱(SimpleLog)。所以一般不会单独使用它。它允许开发人员使用不同的具体日志实现工具:Log4j,jdk自带的日志(JUL)
JCL有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)
1、JCL入门
1.1、新建maven工程
1.2、添加依赖
<!--jcl-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
1.3、入门代码
//入门代码
@Test
public void test01() throws Exception{
//1、获取log日志记录器对象 org.apache.commons.logging.Log;
Log log = LogFactory.getLog(JCLTest.class);
//2、日志记录的输出
log.info("Hello JCL"); //默认调用JDK14,加入log4j依赖和配置文件后,就调用log4j
}
测试
这里不加配置文件和log4j的依赖,默认调用的是JDK14,加了依赖和配置文件后,就会调用log4j
加入log4j依赖和配置文件
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
#指定RootLogger 顶级父元素默认配置信息
#指定日志级别是trace,使用appender为console,file,rollingFile ,dailyFile,logDB
log4j.rootLogger = info,console
#
#1、指定控制台日志输出的appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
#指定消息格式layout,使用简单格式SimpleLayout ,HTML格式HTMLLayout,xml格式xml.XMLLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
#指定消息格式的内容
#log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
log4j.appender.console.layout.conversionPattern =[%p] %r %l %d{yyyy-MM-dd- HH:mm:ss:SSS} %m%n
测试
1.4、我们为什么要使用日志门面
(1).面向接口开发,不再依赖具体的实现类。减少代码的耦合;
(2).项目通过导入不同的日志实现类,可以灵活的切换日志框架;
(3).统一API,方便开发者学习和使用;
(4).统一配置便于项目日志的管理。
2、JCL原理
1.通过LogFactory动态加载Log实现类
2、日志门面支持的日志实现数组
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"
};
3、获取具体的日志实现
for(int i = 0; i < classesToDiscover.length && result == null; ++i)
{
result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
}
以之前代码为例。这里首先会在 classesToDiscover 属性中寻找,按数组下标顺序进行寻找,开始我们没有加入log4j依赖和配置文件,这里 "org.apache.commons.logging.impl.Log4JLogger",就找不到,会继续在数组中寻找,第二个"org.apache.commons.logging.impl.Jdk14Logger",是JDK自带的,此时就使用它。当我们加入log4j依赖和配置文件后,就直接找到org.apache.commons.logging.impl.Log4JLogger,并使用它。如果需要再加入其它的日志,需要修改原码,并且在log中实现它,扩展性很不好。JCL已经被apache淘汰了。