Apache Commons-logging使用实例

来源:互联网 发布:小米手环好用吗 知乎 编辑:程序博客网 时间:2024/06/05 14:29
Apache Commons-logging使用实例
本文将介绍如何在程序中使用Apache Commons-logging

1.Commons-Logging简介

Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体实现的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现。

2.快速入门

JCL有两个基本的抽象类:Log(基本记录器)LogFactory(负责创建Log实例)。当commons-logging.jar被加入到 CLASSPATH之后,它会合理地猜测你想用的日志工具,然后进行自我设置,用户根本不需要做任何设置。默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):
   1. 寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值
   2. 寻找系统中属性中名叫org.apache.commons.logging.Log的值
   3. 如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
   4. 如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
   5. 使用简易日志包装类(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自带日志实现类。它实现了Log接口,把日志消息都输出到系统错误流System.err 中。 
-org.apache.commons.logging.impl.NoOpLog       common-logging自带日志实现类。它实现了Log接口, 其输出日志的方法中不进行任何操作。

3.使用JCL开发

因为Log4j的强大,同时开发者又不希望对Log4j的依赖性太强。所以目前比较流行的是Commons-logging和Log4j结合使用。
 
1. 部署日志器
   下载commons-logging.jar和log4j.jar包,能后把它们放到工程的lib目录下,引入工程中。
2. 指定日志器
   在属性文件common-logging.properties中设置实现接口的类。如下(这里设置Log4j为所使用的日志包):
#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.Log4JLogger
 
#JDK4 Logger
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
 
3.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();
 
4.信息级别
确保日志信息在内容上和反应问题的严重程度上的恰当,是非常重要的。
1)fatal非常严重的错误,导致系统中止。期望这类信息能立即显示在状态控制台上。
2)error其它运行期错误或不是预期的条件。期望这类信息能立即显示在状态控制台上。
3)warn使用了不赞成使用的API、非常拙劣使用API, '几乎就是'错误, 其它运行时不合需要和不合预期的状态但还没必要称为 "错误"。期望这类信息能立即显示在状态控制台上。
4)info运行时产生的有意义的事件。期望这类信息能立即显示在状态控制台上。
5)debug系统流程中的细节信息。期望这类信息仅被写入log文件中。
6)trace更加细节的信息。期望这类信息仅被写入log文件中。
通常情况下,记录器的级别不应低于info.也就是说,通常情况下debug的信息不应被写入log文件中。
4.Apache Commons-logging使用流程
1)将common-logging.jar 包加入到环境变量或者classpath。
2)导入org.apache.commons.logging.Log; org.apache.commons.logging.LogFactory;及相关包
3)在需要使用logging的地方获取Log实例。
private static Log log = LogFactory.getLog(LogDemo.class);

4)使用Logger对象的debug,info,fatal...方法。
log.debug("Debug info.");
5.Apache Commons-logging使用示例
LogDemo.java
package com.xiya.test;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * Created by N3verL4nd on 2017/4/24. */public class LogDemo {    private static Log log = LogFactory.getLog(LogDemo.class);    public static void main(String[] args) {        log.fatal("FATAL");        log.error("ERROR");        log.warn("WARN");        log.info("INFO");        log.debug("DEBUG");        log.trace("TRACE");    }}
结果:
[FATAL] LogDemo - FATAL
[ERROR] LogDemo - ERROR
[WARN] LogDemo - WARN
[INFO] LogDemo - INFO
当没有任何配置文件(.properties)时,就如同上的结果。此时,它使用的是使用简易日志包装类(SimpleLog)。(INFO级别一下的不被打印出来)
下面加入包与配置文件,使其使用log4j。
1)  加入配置文件commons-logging.properties和log4j.properties。
2)  将 log4j.jar 和 common-logging.jar 两个包加入到环境变量或者classpath 。
3)LogDemo.java内容不变。
3)  commons-logging.properties
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
 
4)log4j.properties
log4j.rootLogger=DEBUG,console#输出到控制台log4j.appender.console=org.apache.log4j.ConsoleAppender#设置输出样式log4j.appender.console.layout=org.apache.log4j.PatternLayout#日志输出信息格式为log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)] %m
结果:
[2017-04-26 18:10:50]-[main-FATAL]-[com.xiya.test.LogDemo-main(13)]: FATAL
[2017-04-26 18:10:50]-[main-ERROR]-[com.xiya.test.LogDemo-main(14)]: ERROR
[2017-04-26 18:10:50]-[main- WARN]-[com.xiya.test.LogDemo-main(15)]: WARN
[2017-04-26 18:10:50]-[main- INFO]-[com.xiya.test.LogDemo-main(16)]: INFO

[2017-04-26 18:10:50]-[main-DEBUG]-[com.xiya.test.LogDemo-main(17)]: DEBUG


6.Apache Log介绍集
[1] Apache Log4j配置说明
[2] Apache Log4j使用实例
[3] Apache Commons-logging使用实例
[4] 如何自建appender扩展Log4j框架
7.参考资料
[1]官方文档
[2] Jakarta Commons Logging(JCL)开发手记
[url]http://blog.csdn.net/fasttalk/article/details/406681




应用程序中使用好日志(Logging)功能能够方便的调试和跟踪应用程序任意时刻的行为和状态。在大规模的应用开发中尤其重要,毫不夸张的说,Logging是不可或缺的重要组成部分。那么我们需要自己开发一套Logging API吗?答案是否定的,我们不用再造轮子了。java自J2SE 1.4版本开始提供一个新的Java Logging API应用程序接口。它能够很方便地控制和输出日志信息到控制台,文件或其它用户定义的地方,如数据库,电子邮件等。当然还有其它的一些 Logging API,如:log4j、JDK、Logkit等等。

那么这么多的Logging工具,我们该选择那个呢?在我们的程序中如何兼容这些个日志组件呢?一个选择是在我们的程序中使用Commons Logging 组件,然后在发布时根据环境来选择不同的底层实现。

Commons项目Logging组件的办法是将记录日志的功能封装为一组标准的API,使其底层实现可以任意修改和变换。开发者利用这个API来执行记录日志信息的命令,由API来决定把这些命令传递给适当的底层实现。因此,对于开发者来说,Logging组件对于任何具体的底层实现都是中立的。

使用Commons的Logging API非常简单。只需导入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);

    // ...
}

有必要详细说明一下调用LogFactory.getLog()时发生的事情。调用该函数会启动一个发现过程,即找出必需的底层日志记录功能的实现,具体的发现过程在下面列出。注意,不管底层的日志工具是怎么找到的,它都必须是一个实现了Log接口的类,且必须在CLASSPATH之中。Commons Logging API直接提供对下列底层日志记录工具的支持:Jdk14Logger,Log4JLogger,LogKitLogger,NoOpLogger (直接丢弃所有日志信息),还有一个SimpleLog。

⑴ 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),则应用将使用内建的SimpleLog。SimpleLog把所有日志信息直接输出到System.err。结束发现过程。

    获得适当的底层日志工具之后,接下来就可以开始记录日志信息。作为一种标准的API,Commons Logging API主要的好处是在底层日志机制的基础上建立了一个抽象层,通过抽象层把调用转换成与具体实现有关的日志记录命令。 本文提供的示例程序会输出一个提示信息,告诉你当前正在使用哪一种底层的日志工具。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class CommonLogTest {
 private static Log log = LogFactory.getLog(CommonLogTest.class);

 public static void main(String[] args) {
  log.error("ERROR");
  log.debug("DEBUG");
  log.warn("WARN");
  log.info("INFO");
  log.trace("TRACE");
  System.out.println(log.getClass());
 }

}

请试着在不同的环境配置下运行这个程序。例如,

1. 在不指定任何属性的情况下运行这个程序,这时默认将使用Jdk14Logger;

2. 然后指定系统属性 -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog再运行程序,这时日志记录工具将是SimpleLog;

3. 把Log4J的类放入CLASSPATH,默认情况下log4j会在类路径上寻找log4j.properties,如果找到就加载,否则查找系统属性log4j.properties,若还是没有找到,则报告错误。因此只要正确设置了log4j的log4j.properties配置文件并放在合适位置,就可以得到Log4JLogger输出的信息。

如果没有设置log4j.properties配置文件,则会输出以下提示:

class org.apache.commons.logging.impl.Log4JLogger
log4j:WARN No appenders could be found for logger (CommonLogTest).
log4j:WARN Please initialize the log4j system properly.

附:
1. commons-logging.properties文件
# commons-logging.properties
# org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
# simplelog.properties
# # Logging detail level,
# # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
#org.apache.commons.logging.simplelog.defaultlog=trace
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

2. log4j.properties

log4j.rootLogger=WARN,STDOUT
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.ImmediateFlush=true
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ss.S} [%c] %m%n 


0 0
原创粉丝点击