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

来源:互联网 发布:java常用项目管理工具 编辑:程序博客网 时间:2024/05/16 05:26

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

by Vikram Goyal
08/07/2002

Log4jJakarta Apache下的一个开源的logging工具。它提供给在开发者自己代码中进行LOGAPI并且可以通过配置文件改变LOG的表现形式。这个文章阐述了Log4j的主要功能,然后运用一个web-base的例子描述一些比较高级的功能。

应用例子

本文使用的是一个web-based的例子,实际通过测试和运行的环境是Windows XP操作系统JDK 1.3.1,Tomcat 4.0.1,Log4j 1.2.4Ant 1.4.1(译者注:只是了解Log4j的用法,没有实际测试运行这个例子).你可以下载Log4jdemo.war然后部署在任意的servlet环境下。同时你也可以下载源代码。这个应用和大多数的web应用一样拥有如下流程。

  • Main Page --> Login --> Welcome Page --> Submit Comments.
  • Main Page --> Register --> Login.
  • Main Page --> Forgot Password.

这个应用本身没有意义,它只是为了让我们更方便的了解本文的主要描述对象-Log4j.放弃其他应用选择web应用来描述Log4j是因为已经有大量的web应用把Log4j作为他们的首选Log机制。

Setup

安装

Log4j可以从Apache Web site下载得到。可以下载到tar.gzzip两种形式,每一种中都包含了源代码,文档,例子,和打包好的.jar文件。你可以提取你想要的部分。如果你愿意,你可以自己编译所提供的源代码。你可以用Ant运行提供给你的build.xml,如果有需要你也可以修改build脚本。使用dist target后可以在dist/lib目录下找到log4j-1.2.4.jar.需要注意的是build需要Java Management Extensions (JMX) API的支持。

Log4j-1.2.4.jar文件加入到ClassPath中后你就可以在你的应用中使用log4jAPI了。上面已经提到你可以在dist/lib中找到它。在我们的web应用中jar文件应该放在web-inf/lib目录下。这样就可以保证你的应用可以找到相应的log4jAPI了。

什么是Logger

在我们实际进行代码之前,我们来了解下log4j有三个主要组件loggers,appenderlayouts.loggers负责消息的类型和消息之间的等级关系,appenders负责log输出方式,layouts负责log最终输出的样式。

Logger想象成在你的应用中是一个默默的工作者它根据你的请求进行log。每一个类可以有一个独立的logger,也可以和其他类共享一个logger.Log4j为你提供一个root logger你的所有的logger都将直接的或者间接的继承自它。这就意味着如果你不打算让你的每个class都有一个单独的logger你就都可以使用Logger.getRootLogger()来获取root logger虽然这种做法并不推荐。

创建一个logger并在你的class中使用它,代表性的做法是调用一个Logger class static方法,通过名字就可以得到一个logger对象。如果实际的logger对象还没有创建这个时候就会为你创建一个新的,每个logger在你的JVM中都是单例的。

Logger需要知道把你的Log请求记录到哪里去。记录到哪里是appender需要完成的工作。Log4j支持写入文件(FileAppender),到控制台(ConsoleAppender),到数据库(JDBCAppender), NT event logs (NTEventLogAppender), SMTP 服务(SMTPAppender), 到远程服务 (SocketAppender), 等等。appender定义了logging对象的属性。例如我们选择JDBCAppender,我们需要告诉log4j实际的数据库(数据库的用户名,密码,连接地址等等)。所有的这些都是我们作为Logging 请求的log目的地的属性,也就是appender的属性。

Loggerappender是我们的log请求的源和目的地.那么我们输出的形式是什么呢?现在layout进入我们的视线.layout定义输出log的形式.log4j提供一些内置的layout形式,如果有需要,你也可以自己创建你自己的layout.一个layout要告诉log4j是不是要显示日期和时间,是不是包含logger的信息,是否包括行号,等等.

Logger遵循父子关系的模式.就象之前说的log4j提供一个默认的root logger.这意味着所有的的logger最终都继承自root logger.logger的父子关系是通过名称体现出来的.举一个例子,你有一个com.foo.bar包下的类MyClass在这个类中我们实例化一个叫做com.foo.bar.MyClassLogger,如果叫做com.foo.barlogger存在的话com.foo.bar.MyClass就是com.foo.bar的子一级,否则com.foo.bar.MyClass就是root logger的子类(如果也没有叫做com,com.foologger)

每个logger都会被分配一个等级.如果你没有手动为你的logger设置一个等级log4j会自动为你的logger设置成父类的等级.如果你所有的logger都没有设置等级,他们都将自动被设置成root logger的等级DEBUG.所以所有的logger都会有一个等级.

log4j中有以下5个等级

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

你的logger的等级对你的logging是如何影响的?因为一个log请求发发自程序内部的,所以只有log request的等级>=这个logger的等级的时候logger才会把请求交给相应的appender.这就意味着我们应用中的所有的log 请求都只可能是这5种中的.这是一个非常重要的原则,也是log4j的真正核心.让我们使用之前的com.foo.bar.MyClass的例子来更进一步的说明这一点

 

假设在你的class(com.foo.bar.MyClass这个类,logger名称和class的位置一样是一个标准的用法),你可以使用logger记录WARN类型的LOG消息.现在让我们假设在你的配置文件中你的com.foo.bar.MyClass的等级是ERROR.这意味着什么?这意味着WARN类型的log请求都不会被发到任何的appender.

为什么?因为log4j认为请求的登记低于logger的等级,所以不理会这些请求.如果log请求的等级是ERRORFATAL就会被处理.同样的如果logger的等级被设置成WARN,log请求也会被处理.这是log4j中非常重要的一个特性,你可以只是在配置中改变loggerlevel等级并不改动代码,不用重新编译,不用重新部署

Log4j大多数是使用configuration文件进行配置,也可以使用log4j提供的API进行配置,下一节将会通过一个简单的例子指导你如何配置.