Apache commons类库是一个通用的类库,提供许多基础的功能,比如说commons-fileupload,commons-httpclient,commons-io,commons-codes,commons-logging等。
Jakarta Commons-logging(JCL)是Apache 最早提供的日志的框架接口。它本身并没有记录log的功能,只是统一了JDK Logging与Log4j的API,并把日志功能交给JDK Logging或者是log4j。简单来说,commons-logging提供日志接口,Log4j,JDK Logging等提供日志的实现。commons-logging在运行时动态查找当前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现
JCL有两个基本的抽象类: Log( 基本记录器 ) 和 LogFactory( 负责创建 Log 实例 )
当commons-logging.jar被加入到 CLASSPATH之后,它会心可能合理地猜测你想用的日志工具,然后进行自我设置,用户根本不需要做任何设置。默认的LogFactory是按照下列的步骤去发现并决定哪个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):
①首先在classpath下寻找commons-logging.properties文件。如果找到,则使用其中定义的Log实现类;如果找不到,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
②查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
③否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
④否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;
org.apache.commons.logging.Log 的具体实现有如下:
---org.apache.commons.logging.impl.Jdk14Logger 使用 JDK1.4 。
---org.apache.commons.logging.impl.Log4JLogger 使用 Log4J 。
---org.apache.commons.logging.impl.LogKitLogger 使用 avalon-Logkit 。
---org.apache.commons.logging.impl.SimpleLog common-logging 自带日志实现类。
---org.apache.commons.logging.impl.NoOpLog common-logging 自带日志实现类。它实现了 Log 接口。 其输出日志的方法中不进行任何操作。
Commons-logging简单日志具体实例
1、非Maven工程,下载commons-logging.jar和log4j-core.jar,log4j-api.jar包,能后把它们放到工程的lib目录下
Maven工程中,在pom.xml文件中加入commons-logging,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.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
2、新增commons-logging.properties文件,放在src/main/resources下
文件内容:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

3、新增log4j2.xml或log4j2.properties的配置文件,放在src/main/resources下
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
<!-- OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %L %M - %msg%xEx%n"/>-->
<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%M]%m%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<!--<PatternLayout charset="UTF-8" pattern="%d{HH:mm:ss.SSS} %-5level %L %M - %msg%xEx%n"/>-->
<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%M]%m%n"/>
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="log/all.log"
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%M]%m%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--建立一个默认的root的logger-->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="log"/>
</root>
</loggers>
</configuration>
3、新增测试类
package com.sc.test02;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.Calendar;
public class LeapYearTest {
private static Log logger = LogFactory.getLog(LeapYearTest.class);
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(2008,2,1);
calendar.add(Calendar.DAY_OF_MONTH,-1);
logger.info(calendar.get(Calendar.DAY_OF_MONTH));
}
}

网友评论