`
wc_stone
  • 浏览: 56739 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Apache Log4j简介

阅读更多
log4j-调试好帮手

1 log的作用
尽管已经涌现出了不少调试应用程序的手段,直接把信息输出到屏幕(或者其他地方)仍然是非常重要的手段,有时甚至是唯一可以利用的方法,尤其在调试分布式应用程序时,比如基于WEB的应用程序。相信大家对WEB应用程序的调试难度都有所体会。



2 为什么选用log4j
System.out.println/printf,的缺点:

a. 信息的输出不够灵活,并且繁琐。比如,要输出执行处的文件名,行数,当前时间等,println/printf显得很原始。
b. 如果要改变输出的内容和格式,需要重新编译源程序,不够灵活。
c. 更严重的是,如果程序中有很多的println/printf,会严重的影响程序的性能。
为了解决上面的问题,人们开发了一些专门log信息的软件包,apache组织的log4j就是其中的佼佼者,在很多著名的开放源代码的项目中都得到了广泛的应用。

log4j致力于:

a. 速度。速度是log4j设计的最重要的目标。从log4j一开始出现,注重运行的速度就一直放在首位,并且坚持不懈地进行着改进和完善。
b. 灵活性。在保证速度的基础上,log4j提供了信息输出的极大灵活性。后面我们通过实例将看到,使用log4j后,不需要重新编译源程序,只需要改变log4j的配置文件,输出的信息就可以随之改变了。
c. 可扩展性。log4j是apache组织的产品,遵循开放源代码的APL协议,你当然可以进行源代码级的定制和扩展。实际上,在log4j的发布包中,就包含了几个如何扩展log4j的例子。
d. 简单。易于使用也是log4j的目标之一。毕竟,log功能只是程序的辅助功能,太复杂的使用方法会宣宾夺主的:-)

3 log4j概念

log4j有三大部分组成:


a.Logger。是我们在程序中要用到的部分。我们就是使用了log4j提供的Logger类中的方法来具体的log信息的。
b.Appender。这里定义log的信息送到哪里去。名字比较怪,大概是因为一般的log文件都是把信息增加到文件最后的缘故吧?^-^ log4j支持的Appender很多,包括终端,文件,socket端口,NT的event logger,Unix的syslog等,非常灵活。
c.Layout。这里是定义log信息的输出格式。
  实际使用时,append和layout一般在配置文件中出现,程序中可以不去管他。因此,只是使用Logger提供的有限的几个功能就可以了。如下是Logger提供的功能:

getLogger,获得一个Logger对象,以便调用下面的几个方法。

  info,输出信息的INFO级别。log4j中,输出信息的级别作用是,当要输出一条信息时,可以规定这条信息的“等级”。这样,就可以在配置文件中限定程序中的logger信息只有高于某个等级时才可以输出,这就是所谓的运行信息过滤技术,非常灵活。log4j的信息优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。比如,如果在配置文件中规定只有info以下级别的调试信息可以输出,那么程序中使用了debug的log信息将不输出。

log,输出指定级别的调试信息。

  常用的就这么多,是不是很简单?实际上,error,info等方法是log4j针对不同的消息等级而设计的“便利方法”而已。
ok,我们通过实例来具体看看这几个方法怎么用。

4 log4j实例

请看如下的简单程序:

文件MyApp.java:

import org.apache.log4j.Logger; 
import com.foo.Bar; 

public class MyApp { 

	static Logger logger = Logger.getLogger(MyApp.class); 

	public static void main(String[] args) { 

		logger.info("entering the application"); 

		Bar bar = new Bar(); 

		bar.doIt(); 

		logger.info("leaving the application"); 

	} 

} 


文件Bar.java:

package com.foo; 

import org.apache.log4j.Logger; 

public class Bar { 

	static Logger logger = Logger.getLogger(Bar.class); 

	public static void main(String[] args) { 

		logger.info("do nothing now"); 

	} 

	public void doIt(){ 

		logger.debug("do it again"); 

	} 

} 


配置文件log4j.properties:

# Global logging configuration
  log4j.rootLogger=DEBUG, stdout,outFile 
# log4j.rootLogger=INFO, stdout,outFile  

# Console output appender 
# stdout is set to be a ConsoleAppender. 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 

# stdout uses PatternLayout. 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %-4r [%t] (%F,%L) %-5p %c %x - %m%n 

# foo logging configuration
log4j.logger.com.foo=DEBUG 

# Rolling file appender 
log4j.appender.R = org.apache.log4j.RollingFileAppender 
log4j.appender.R.File = example.log 
log4j.appender.R.MaxFileSize=100KB 

# Keep one backup file 
log4j.appender.outFile.MaxBackupIndex=1 
log4j.appender.outFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.outFile.layout.ConversionPattern=%p %t %c - %m%n


运行结果:

2002-11-24 13:47:21,397 0 [main] (MyApp.java,20) INFO MyApp - entering the application 

2002-11-24 13:47:21,423 26 [main] (Bar.java,24) DEBUG com.foo.Bar - do it again 

2002-11-24 13:47:21,424 27 [main] (MyApp.java,23) INFO MyApp - leaving the application 


5 log4j的配置文件
配置文件的主要作用为:


a. 定义输出信息的目的地。log4j支持的输出类型非常多,有文件,终端,socket,unix syslog,NT event log等。log4j没有缺省的输出目的地,因此必须在配置文件至少指定一个目的地。
b. 定义输出格式。对于每一个输出目的地,都可以定义对应的输出格式。通常,输出格式可以通过灵活的PatternLayout来控制。 PatternLayout的控制方式非常类似于C语言中的printf语句的用法,完整的格式控制字符可以参考PertternLayout的 javadoc文档。
c. 可以灵活的开关log,便于调试。

Bibliography
online docement
http://www.apache.org,阅读log4j的在线文档,尤其是log4j的作者自己写的shot introduction,非常好。
1.2在线API:http://logging.apache.org/log4j/1.2/apidocs/index.html
log4j in jboss
jboss对log4j的扩展,在$JBOSS_HOME/lib/jboss-common.jar中。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics