(Jarkata 的 Commons Logging 包现在已经被用在几乎所有的开源项目之中,它可以使你开发的系统工作在不同的日志框架下,包括Sun的logging框架和Apache Log4j。现在Commons Logging + Apache Log4j 的身影是随处可见,Commons Logging 的易用与Log4j的强大功能形成了绝配。)
问题:
你正在写一个可重用的代码库,而你不知道你的代码在哪里并且是如何工作的。你需要一个抽象的日志接口来写入日志信息,因为你不能确定Log4j或者是JDK 1.4 logging的存在性。
解决:
通过Jakarta Commons Logging 的Log 接口来记录信息,然后依靠Commons Logging自身来决定在运行时使用哪种具体的日志框架。下面的代码使用了Log接口来记录trace,debug,info,warning,error和fatal信息:
1 import org.apache.commons.logging.LogFactory;
2 import org.apache.commons.logging.Log
3
4 Log log = LogFactory.getLog( "com.discursive.jccook.SomeApp" );
5
6 if( log.isTraceEnabled( ) ) {
7 log.trace( "This is a trace message" );
8 }
9
10 if( log.isDebugEnabled( ) ) {
11 log.debug( "This is a debug message" );
12 }
13
14 log.info( "This is an informational message" );
15
16 log.warn( "This is a warning" );
17
18 log.error( "This is an error" );
19
20 log.fatal( "This is fatal" );
LogFactory.getInstance() 返回一个Log接口的具体实现,这个实现与底层具体的日志框架相对应。例如,如果你的系统是使用Apache Log4j ,一个Log4JLogger将被返回,对应于Log4J category
com.discursive.jccook.SomeApp 。
讨论:
一个可重用代码库的开发者不能预知其代码库将在何时何地被用到,而现在有很多的日志框架可以使用,所以当开发可重用代码库的时候,使用Commons Logging 是非常明智的,例如Jakarta Commons 组件。当调用LogFactory.getInstance()方法的时候,Commons Logging 将通过系统属性和classpath中的类库来决定和管理适当的日志框架。对于一个小型可重用组件的开发者来说,进行日志记录只需要调用Log接口。而配置底层日志框架的负担,就转移到使用其组件库的开发者身上。
参考:
7.11节详细的说明了Commons Logging在运行时确定适当日志框架的算法。