作者: BUILDER.COM
任何应用软件都需要一个从外界收集和交换数据的途径,这可以通过界面,数据库或使用文本文件来实现。有了这么多选择,使用普通的文本文件来做数据的采集和调试的方法似乎已经被人忘记,虽然文本文件不能给你提供最新的技术所带来的兴奋感觉,但是他却能有效地对应用软件的数据进行采集和分析。
Log4j数据包
利用Java编程语言中的库可以轻松地向文件写入数据。但在有一个良好的数据包可以使用的情况下,为什么还要进行二次开发呢?Java SDK 1.4版本将内建一个logging API,但在他更加成熟之前,我还是会坚持使用一些更加得到实际证实的东西?例如log4j数据包:它具有健全、可靠、可轻松扩展、应用简易等的特点,你可以从Apache Jakarta project得到log4j。要使用log4j,在应用软件的CLASSPATH中需要具有log4j.jar文件。
根起始类别
log4j是以类别的概念为中心进行组织的,在应用软件运行时,log4j可以在任何时间拥有任意多的类别。根类别时一直存在的,他是类别等级的起始。类别像Java数据包那样使用点式标记来进行命名,这可以很轻易地通过在现有的代码结构中安置特定的logging来控制logging声明是如何被处理的。
类别具有继续的特性,所以一个名叫com.versatilesolutions.example的类别将会从com.versatilesolutions类别继续设置。你可以对一个类别设置优先权来控制logging应用软件的数量。优先权包括调试、信息、警告、错误、严重错误。当你调用logging程序时,可以通过使用不同的方法对不同的优先权进行设置。假如你正在进行大型操作,你可以检查现有优先权是否被激活,这样大型操作只有在声明被记录的情况下才能运行。
Logging的种类和形式
当logging数据包收到一个logging声明时,log4j使用附加器来指定运行什么类型的logging。Log4j的标准附加器包括屏幕,文件,轮转文件和一个答应在中心区域记录数据的采集的远程附加器。附加器在类别中的应用使得应用软件中的不同部分可以有不同的记录目的地。
假如你给类别设置了优先权和附加器,剩下的就是设置一个形式。形式控制着logging声明的实际格式,例如日期,时间,基准时间和线识别等。由于你可以从log4j的资料中找到所有可用格式的摘要,这里我就 不再详述了。
对log4j的配置可以通过XML文件或Java属性文件来完成。我更喜欢Java属性文件技术,这是由于他真正地具有对于XML文件的压倒性优势。列表A包含一个用来配置log4j的属性文件。
属性文件中第一个无注释行指定了根类别具有调试的优先权和三个附加器,分别标注为A1,A2,A3。剩余部分为每一个识别器指定了附加器。在这个属性文件里,附加器分别是控制(屏幕),轮转文件和UDP播放器。
UDP播放器属于一个附加器,我把他加入log4j数据包中使得我可以互动地观察记录声明。每一个附加器都有一个形式对象,在这里面使用了PatternLayout并随之以转换模式。转换模式中的特性指定了输出,%符号用来指定格式特性,在此例中,%-5p代表在优先权中使用五个特性的左对齐(p),接着是日期(%d),线信息(%t),消息(%m),最后是线终止特性(%n)。
在应用软件中使用log4j,你需要用PropertyConfigurator来加载这个属性文件,在起始类中的一行信息会实现这一目的:
….
PropertyConfigurator.configure("path/to/file.properties");
配置被加载之后,应用软件中需要logging功能的类都需要对类别对象的参照。由于类别使用数据包命名方式,我经常使用与类别相同的类名,尽管这不是必须的,而是根据你如何对配置进行安排所决定的。声明一个类的单静态变量可以使logging程序可用:
import org.apache.log4j.Category;
….
private static final Category log = Category.getInstance(MyClass.class.getName());
logging事件
在应用软件中的logging现在可以轻松实现,只要调用与所logging信息的优先权相对应的方法即可。例如,下面是调试信息:
log.debug("Log4j really works!");
假如你要确定调试优先权被激活,你可以在调试调用之前进行查看。要注重的是除非正确地设置了优先权,否则即使你发出了信息也不会被记录。检查当前的优先权是一种避免大型操作先于记录操作现象得简单方法。下面是一个在记录声明之前检查优先权的例子:
if ( log.isDebugEnabled() ) {
log.debug("Another log statement.”);
}
你也可以在记录方法中加入一个例外,例外中包含有记录消息如下面所示:
log.warn("Oops caught an exception.", myException);
假如你的应用软件需要一个强力的logging功能,看一看log4j数据包吧,他提供了很强的适应性,具有可配置的附加器和优先权体系可以使你对产品中的logging进行控制和调整而不会使系统显著扩大。