Apache Commons Logging


本文是apache commons系列文章中的一篇,更多文章请参看:ApacheCommons系列文章索引


简介

应用程序中使用好日志功能能够方便的调试和跟踪应用程序任意时刻的行为和状态。这在大规模的应用开发中尤其重要,日志是应用程序不可或缺的重要组成部分。
记录日志是一个专业工作,比如日志需要分等级记录;不同类型的日志分不同的路径记录;不同的日志需要输出到不同的目的地(硬盘,网络等)。当然开发者不需要自己在造轮子实现这些功能,市场上已经有很多日志框架,比如log4j,logkit等,java1.4开始也提供了java logging api。
此时,有两个问题
- 框架切换成本太高:在程序中如果使用了日志框架A,当想要切换为日志框架B的时候,成本将会非常高,因为调用框架A的代码都是硬编码的,无法用于框架B。
- 切换框架时,学习成本高:从log4j切换到logkit,开发者需要理解两套不同的api。
acl可以解决上面两个问题,它将主流的日志框架功能封装为一组标准的API,使其底层实现可以任意修改和变换。开发者利用这个API来执行记录日志信息的命令,由API来决定把这些命令传递给适当的底层实现。因此,对于开发者来说,记录日志功能的具体实现框架是透明的。
Apache Commons Logging_第1张图片
可以理解为acl是一套日志api标准,而日志框架比如log4j,logkit都是这套标准的不同实现。

使用

获取org.apache.commons.logging.Log实例

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CommonLogTest {
 private static Log log = LogFactory.getLog(CommonLogTest.class);
    // ...
}

打印日志。org.apache.commons.logging.Log接口定义了以下方法,日志级别由高到低排列。

log.fatal(Object message);
log.fatal(Object message, Throwable t);
log.error(Object message);
log.error(Object message, Throwable t);
log.warn(Object message);
log.warn(Object message, Throwable t);
log.info(Object message);
log.info(Object message, Throwable t);
log.debug(Object message);
log.debug(Object message, Throwable t);
log.trace(Object message);
log.trace(Object message, Throwable t);

此以外,还提供下列方法以便代码保护。

log.isFatalEnabled();
log.isErrorEnabled();
log.isWarnEnabled();
log.isInfoEnabled();
log.isDebugEnabled();
log.isTraceEnabled();

底层日志框架的发现过程

调用LogFactory.getLog()函数会启动一个底层日志框架的发现过程,即找出必需的底层日志记录功能的实现,具体的发现过程如下:
- Commons的Logging首先在CLASSPATH中查找commons-logging.properties文件。这个属性文件至少定义org.apache.commons.logging.Log属性,它的值应该是上述任意Log接口实现的完整限定名称。如果找到org.apache.commons.logging.Log属性,则使用该属相对应的日志组件。结束发现过程。
- 如果上面的步骤失败(文件不存在或属性不存在),Commons的Logging接着检查系统属性org.apache.commons.logging.Log。 如果找到org.apache.commons.logging.Log系统属性,则使用该系统属性对应的日志组件。结束发现过程。
- 如果找不到org.apache.commons.logging.Log系统属性,Logging接着在CLASSPATH中寻找log4j的类。如果找到了,Logging就假定应用要使用的是log4j。不过这时log4j本身的属性仍要通过log4j.properties文件正确配置。结束发现过程。
- 如果上述查找均不能找到适当的Logging API,但应用程序正运行在JRE 1.4或更高版本上,则默认使用JRE 1.4的日志记录功能。结束发现过程。
- 最后,如果上述操作都失败(JRE 版本低于1.4),则将使用acl内建的SimpleLog。SimpleLog把所有日志信息直接输出到System.err。结束发现过程。

你可能感兴趣的:(【Java,基础】)