日志记录为我们的项目维护提供了极具价值的参考消息,灾难性的恢复或系统改良都离不开这些信息,日志机制是日常项目开发中必不可少的一道作业工序。
一、Apache通用日志包简介
Apache的通用日志包commons-logging是jakarta common(jakarta commons项目是作为JDK的补充拓展及优化的一系列方案)的日志解决方案,它提供了一组通用的第三方日志组件的接口,用户可以根据需要自由选择,同时它还把日志管理机制与我们的应用程序进行了隔离,避免应用程序的api与日志耦合在一起。
Apache通用日志包commons-logging.jar下载地址:
Apache的通用日志包由于其灵活性与非侵略性的优点,已被各种framework推荐采纳使用,像struts、hibernate、spring,在tomcat安装目录的bin目录下也包含了commons-logging.jar,如今的MyEclipse6.0创建一个web project会自动将commons-logging.jar引入web/lib下,所以你几乎无需去下载和引入这个包便可使用,它已经被广泛的使用和采纳。
Commons日志包支持以下第三方的日志组件:
·log4j
·JDK14Logging
·LogKit
·SimpleLog
·NoOpLog
二、Apache通用日志管理机制
Apache通用日志等级:
Commons日志包将日志消息分为6个级别:

这6个级别由上至下,由高至低。当我们在配置文件中指明日志消息的一个输出级别时(关于Commons日志包的配置方法将在后面说明),只有比这个级别高级的信息才会输出。例如:我们将日志输出级别设置为INFO,那么位于DEBUG以下级别的信息将不会输出。
Apache通用日志API:
commons-logging包下包含org.apache.commons.logging包和org.apache.commons.logging,impl包

org.apache.commons.logging包:
Log类:Log是常用的接口,声明了日志对象的使用方法;
LogConfigurationException类:继承于RuntimeException,定义了日志的异常信息;
LogFactory类:Log的工厂,
静态工厂方法getLog(Class clazz)和getLog(String name)返回一个Log实例,
getLog(Class clazz) 和getLog(String name)具体定义如下:
java 代码
- publicstatic Log getLog(Class clazz) throws LogConfigurationException {
- return (getFactory().getInstance(clazz));
- }
- publicstatic Log getLog(String name) throws LogConfigurationException {
- return (getFactory().getInstance(name));
- }
我们可以看出来getLog方法返回的Log实例是通过调用getFactory()返回一个 LogFactory实例再调用
getInstance()
方法得到的,
getInstance()
是一个抽象方法,
在
getFactory
方法中(由于篇幅有限,不再将
getFactory
源码贴出,有兴趣可以自
己看下源码)会加载
commons-logging.properties
属性文件
(
由
FACTORY_PROPERTIES
字段表示,关于属性配置文件稍后说明
)
将
org.apache.commons.logging.Log
接口按照具体指明的类去实现,然后调
用由已
实现的
getInstance
方法来得到
Log
实例。
LogSource类:这个类作为向上兼容,已由LogFactory取代。
org.apache.commons.logging.impl包:
这个包包含了一些已实现了Log接口的类,不再赘述。
三、Apache通用日志的配置
Commons日志配置非常简单,您只需在工程src目录下建立一个commons-logging.properties属性文件,指明
org.apache.commons.logging.Log
接口将由哪个第三方的日志组件来实现即可。
例如:
commons-logging.properties
中写入如下配置
- org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
即使用log4j来管理日志,这个Log4JLogger类只实现了一些简单的日志输出,如果要使用将日志信息输出到指定文件或其他功能需要引入log4j的类库,我会在日后写一篇关于log4j的具体使用方法与相关配置说明。