JCL
- 简介
-
- 官方网址
- 手册地址
- 使用
-
- maven依赖
- java使用
- 原理
-
- Log类的实现
- 实现流程
- LogFactory
简介
JCL(Jakarta Commons Logging)
是Apache提供的一个通用日志API。
它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具: Log4j, Jdk自带的日志(JUL), SimpleLog(JCL自己实现的日志实现类)
官方网址
http://commons.apache.org/proper/commons-logging/index.html
手册地址
http://commons.apache.org/proper/commons-logging/guide.html
使用
maven依赖
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
java使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Log log = LogFactory.getLog(JclDemo.class);
log.info("test start ");
原理
JCL 有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)。
Log类的实现

实现流程
当commons-logging.jar被加入到 CLASSPATH之后,它会心可能合理地猜测你喜欢的日志工具,然后进行自我设置,用户根本不需要做任何设置。默认的LogFactory是按照下列的 步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):
- 寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值
- 寻找系统中属性中名叫org.apache.commons.logging.Log的值
- 如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
- 如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
- 使用简易日志包装类(SimpleLog)
LogFactory
LogFactory
的实现类
org.apache.commons.logging.impl.LogFactoryImpl
, 用于选择哪个日志实现方式
/**
* The names of classes that will be tried (in order) as logging
* adapters. Each class is expected to implement the Log interface,
* and to throw NoClassDefFound or ExceptionInInitializerError when
* loaded if the underlying logging library is not available. Any
* other error indicates that the underlying logging library is available
* but broken/unusable for some reason.
*/
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"
};
for(int i=0; i<classesToDiscover.length && result == null; ++i) {
result = createLogFromClass(classesToDiscover[i], logCategory, true);
}
在上面4个实现类中选择一个, 优先
log4j
, 然后是
jul(org.apache.commons.logging.impl.Jdk14Logger)
如果pom引入了
log4j
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
会优先使用
log4j
,
如果没引入实现类, 则使用
jul(org.apache.commons.logging.impl.Jdk14Logger)