Apache Commons logging简介和使用
本章节内容主要来自网络和整理。
Apache Commons Logging,又叫做JakartaCommons Logging (JCL),他提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现.
执行顺序
JCL有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)。当commons-logging.jar被加入到CLASSPATH之后,它会心可能合理地猜测你想用的日志工具,然后进行自我设置,用户根本不需要做任何设置。
默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的,LogFactory按照顺序寻找,找到第一个工具后中止。
1.寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值
2.寻找系统中属性中名叫org.apache.commons.logging.Log的值
3.如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
4.如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger);如果是其他版本的JDK,也会调用类似的包;
5.使用简易日志包装类(SimpleLog)(新版本不用再考虑)
提示:如果在应用中有多个地方配置了日志的相关属性,可能最终执行的时候,没有按照预期进行执行,那么就有可能在其他优先级更加高的地方也设置了日志属性;导致最关注的日志属性根本没有得到执行,那么就可以按照这个执行顺序去寻找。
使用JCL开发
比较流行的是Commons-logging和Log4j结合使用。
1. 部署日志器
下载commons-logging.jar和log4j.jar包(下载参考地址:http://www.ibiblio.org/maven/或http://jakarta.apache.org/),能后把它们放到工程的lib目录下,引入工程中。
2. 指定日志器
在属性文件common-logging.properties中设置实现接口的类。如下:
#commons-logging.properties文件配置信息
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
# Must be one of ("trace","debug", "info", "warn", "error", or"fatal").
#利用log4j为输出介质
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
#JDK5 Logger
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
在属性文件log4j.properties中设置日志的输出信息
#log4j.properties文件配置信息
log4j.rootLogger=ERROR,stdout,LF5,,file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[start]%d{yyyy/MM/dd/HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]n%c[CATEGORY]%n%m[MESSAGE]%n%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=sdcrm.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[start]%d{yyyy/MM/dd/HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
log4j.appender.LF5=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
最后要把properties属性文件保存到Web-INF/classes目录下。
实现例:
//在程序文件头部import相关的类
import org.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
......
//在类中获取一个实例
public class MYCLASS
{
private static Log log =LogFactory.getLog(MyCLASS.class);
...
}
日志信息被送往记录器,如上例中的log。这个发送过程,是通过调用Log接口中定义的方法完成的,不同方法跟不同的级别联系在一起,日志信息通过哪个级别的方法发送,就标明了日志信息的级别。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();
信息级别
确保日志信息在内容上和反应问题的严重程度上的恰当,是非常重要的。
fatal非常严重的错误,导致系统中止。期望这类信息能立即显示在状态控制台上。
error其它运行期错误或不是预期的条件。期望这类信息能立即显示在状态控制台上。
warn使用了不赞成使用的API、非常拙劣使用API, ‘几乎就是‘错误, 其它运行时不合需要和不合预期的状态但还没必要称为 "错误"。期望这类信息能立即显示在状态控制台上。
info运行时产生的有意义的事件。期望这类信息能立即显示在状态控制台上。
debug系统流程中的细节信息。期望这类信息仅被写入log文件中。
trace更加细节的信息。期望这类信息仅被写入log文件中。
通常情况下,记录器的级别不应低于info.也就是说,通常情况下debug的信息不应被写入log文件中。
生命周期
JCL LogFactory必须实现建立/断开到日志工具的连接,实例化/初始化/解构一个日志工具.
异常处理
JCL Log 接口没有指定任何异常处理,对接口的实现必须捕获并处理异常。
多线程
JCL Log 和 LogFactory 的实现,必须确保任何日志工具对并行的要求.
历史渊源
org.apache.commons.logging.Log 和org.apache.log4j.Logger 这两个类,通过包名我们可以发现它们都是 apache 的项目,既然如此,为何要动如此大的动作搞两个东西(指的是 commons-logging 和 log4j)出来呢?事实上,在 sun 开发 logger 前,apache 项目已经开发了功能强大的 log4j 日志工具,并向 sun 推荐将其纳入到 jdk 的一部分,可是 sun 拒绝了 apache 的提议,sun 后来自己开发了一套记录日志的工具。可是现在的开源项目都使用的是 log4j,log4j 已经成了事实上的标准,但由于又有一部分开发者在使用 sun logger,因此 apache 才推出 commons-logging,使得我们不必关注我们正在使用何种日志工具。