上文描述了如何在Apusic AS的Web应用中调用LogJ有些朋友会觉得LogJ使用前还需要初始化比较麻烦还有些朋友会说怎么你这个LogJ使用起来那么复杂我们的项目都没有那么过程呀?那是因为许多Web应用中是用Java commonslogging(JCL)+LogJ的如果采用JCL+LogJ就不需要初始化了
那么为什么有了LogJ又有JCL呢?是因为SUN的JDK 中自带有日志框架LogJ是Apache提供的日志框架为了扩展应用的兼容性保证应用可以无缝切换到不同的日志框架因此JCL提供的是日志系统的接口通过给工厂接口提供不同的实现类从而保证与不同日志框架的兼容同时为了保证系统的有效性还提供了一个非常简单的日志框架实现以便没有外接其他日志框架时可以使用自带的
那么为什么JCL+LogJ就不需要初始化了呢?这要从JCL的执行流程说起当应用执行类似以下代码时
import monsloggingLog; import monsloggingLogFactory;
public class LoggingDemo { private static Log log = LogFactorygetLog(LoggingDemoclass); // } LogFactorygetLog()函数会启动一个搜索过程找出底层日志记录功能的实现具体的发现过程在下面列出
⑴ Commons的Logging首先在CLASSPATH中寻找一个commonsloggingproperties文件这个属性文件至少定义monsloggingLog属性它的值应该是实现Log接口的完整限定名称
⑵ 如果上面的步骤失败Commons的Logging接着检查系统属性monsloggingLog以便找到实现Log接口的完整限定名称属性可以通过服务器启动时参数配置或者在代码中使用SystemsetProperty()函数操作具体可以参考附件
⑶ 如果找不到monsloggingLog系统属性Logging接着在CLASSPATH中寻找logj的类如果找到了Logging就假定应用要使用的是logjlogj本身的属性需要按照框架配置文件定义的方式进行一般是通过logjproperties文件正确配置
⑷ 如果上述查找均不能找到适当的Logging API但应用程序正运行在JRE 或更高版本上则默认使用JRE 的日志记录功能
⑸ 最后如果上述操作都失败则应用将使用内建的SimpleLogSimpleLog把所有日志信息直接输出到Systemerr
了解了以上的过程就会明白为什么JCL+LogJ不再需要初始化使用JCL+LogJ只需要在WEBINF/lib下放置commonsloggingjar和logjjar包在WEBINF/classes下放置logjproperties和commonsloggingproperties(可选)文件就可以在程序中随意的使用了