首页 > 代码库 > Apache Commons logging简介和使用

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,使得我们不必关注我们正在使用何种日志工具。

Apache Commons logging简介和使用