使用log4j建立灵活的log机制 - 2

时间:2021-09-25 23:10:46

原文地址http://www.onjava.com/pub/a/onjava/ 2002/08/07 /log4j.html?page=2

by Vikram Goyal
08/07/2002

一个简单的log4j的例子

这个应用拥有五个servlet(SetupServlet , LogonServlet, GetCommentsServlet, ForgotPasswordServlet, RegisterServlet) 4JSP;和一个文件的数据库用来存储用户信息(userDB,应该位于web-inf目录下,确保web.xml文件中填写的是正确的路径)

来看一个实际运行的例子,把log4j demo.war文件部署到你的servlet环境中。然后,修改web.xml文件确保其中的参数都真实有效。这个文件位置在所部署的应用的web-inf目录下(另外三个配置文件也一样:config-JDBC,config-MDC,config-NDC)。重起你的服务,启动中会输出一些信息。如果StartupServlet可以找到userDB的话,你将会在屏幕上看到下面的信息

Using properties file:

C:/jakarta-tomcat- 4.0.1 /webapps/Log4JDemo/WEB-INF/config-simple.properties

  Watch is set to: null

  DEBUG - Added line: JohnDoe,herbert,johndoe@john.com,John Doe

前两行的输出是System.out.println打印出来的。其余的都是通过log4j.让我们这是怎么做到的。

用本文编辑工具打开config-simple.properties文件,其中有三行语句(除掉注释)。第一行,log4j.rootLogger=debug,R 设置rootLogger的等级是DEBUG.这一行是默认的,不一定必须要。逗号后的R是必须的,这样是为了告诉LOG4J root logger所对应的是这个名叫Rappender。下面的几行来定义这个appender的属性。

log4j.appender.R=org.apache.log4j.ConsoleAppender这一行定义appender R的类型是ConsoleAppender,简单来说就是这个appenderLOG将输出到命令行。log4j.appender.R.layout=org.apache.log4j.SimpleLayout定义这个appender使用的是simple layout:只输出两种信息:log请求的等级,和实际的输出信息。

Now that we have understood the configuration of our simple example, lets see how we are actually logging in our code. Open up SetupServlet.java in a text editor and look up line 81:

我们介绍了一个简单的配置的例子。现在让我们来看看我们的实际的log的代码。打开SetupServlet.java找到地81行。

 

PropertyConfigurator.configure(props);

 

暂时不要去管周围的代码。这行代码是让log4j找到相应的配置文件丛中获得属性。这行代码在你的应用中必须被调用一次,一般都是你的应用的开头位置。在 web 应用中Servlet 的启动代码是个合适的位置。

 

设置过我们的log4j属性后,我们就做好开始log的准备了。下一步我们要获取一个logger并且使用它来进行所需的log.我们既可以用Logger.getRootLogger()来获取root logger也可以象我们在SetupServlet中那样通过名字来获得一个logger实例。

 

Logger log = Logger.getLogger(SetupServlet.class);

 

这个方法返回了相对应的logger,我们可以使用它来进行log.例如我们在112行调用DEBUG方法:log.debug(“Add Line:”+data);实际运行时我们就可以在控制台看到输出了。注意这里我们的配置文件中root logger的等级为DEBUG我们并没有为demo.log4j.servlet.SetupServlet这个logger设置相应的等级它会自动的继承root logger的等级DEBUG,所以我们以上的调用会被送到appender中,试着把root logger的等级改为ERROR会发现之前的那些输出都不见了,这是因为logger的等级变的比实际的log请求的等级高。注意改变root logger的等级你只需要修改配置文件然后重新启动servlet环境就可以(虽然不是一定要重新启动servlet环境这涉及到configureAndWatch我们在后面会讨论这个内容)

 

 

我们已经了解了这个简单的例子。让我们重新整理一下这个例子中使用log4j所需要的几步操作

  1. 创建配置文件. 在文件中:

  • 设置root logger的等级,并为之设置appender.

  • 定义appender的属性.

  • 定义appenderlayout.

  • 在程序代码中通过类名获取一个logger. 典型的做法是具体的类对应具体的logger.

  • 在需要时调用以下log语句 (log.debug(), log.info(), log.warn(), log.error(), log.fatal()).

  • Management Requirements

    虽然我们完成了一个相当简单的例子,并了解LOG4J的功能,我们的例子在实际应用中是显然不够的。现在让我站在你的老板的角度来指出这个例子的不足之处。

    • Log到控制台是没什么意义的,这使得必须要有一个人在出现重大问题的时候做记录。

    • SimpleLayout 太简单了.输出的信息太少。

    • web应用中。不同的用户在不同的servlet中产生了各种各样的log信息。要分辨不同用户的信息非常的困难。

    第二个问题很简单,我们可以把SimpleLayout换成PatternLayout并且为它定义一个conversion pattern.