使用Log4J进行日志操作

jopen 10年前

使用Log4J进行日志操作

Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台、文件、CUI 组件、NT的事件记录器;还可以控制每一条日志输出格式。此外,通过定义日志信息的级别,能够非常细致地控制日志的输出,最令人感兴趣的是,这些功能可以 通过一个配置文件来灵活进行配置,而不需要修改应程序代码。

在应用程序中输出日志有3个目的:

l  监视代码中变量的变化情况,把数据周期性记录到文件中供其他应用进行统计分析工作

l  跟踪代码运行时轨迹,作为日后审计的依据

l  担当集成开发环境中的调试器的作用,向文件和控制台打印代码的调试信息

要在程序中输出日志,最普通的做法就是在代码中嵌入语句,这些打印语句可以把日志输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥代码的主体。

在进入学习Log4J之前,我们要了解通用日志包中的两个常用接口LogFactory和Log,下面分别介绍它们的用法。

(一)Log接口

通用日志包把日志消息分为6种级别:FATAL(致命的)、ERROR(错误)、WARN(警告)、INFO(信息)、DEBUG(调试)和TRACE(细节)。其中FATAL级别最高,TRACE级别最低。通用日志包采用日志级别机制,可以灵活的控制输出的日志内容。

org.apache.commons.logging.Log接口代表日志器,它提供了一组输出日志的方法:

l  fatal(Object message): 输出FATAL级别的日志消息。

l  error(Object message): 输出ERROR级别的日志消息。

l  ……

l  trace(Object message): 输出TRACE级别的日志消息。

    对于以上输出日志的方法,只有当它输出日志的级别大于或等于为日志其配置的日志级别时,这个方法才会被真正执行。例如,如果日志器的日志级别为WARN, 那么在程序中,它的fatal()、error()和warn()方法会被执行,而info()、debug()和trace()方法不会被执行。

Log接口还提供了一组判断是否允许输出特定级别的日志消息的方法:

l  isFatalEnabled()

l  isErrorEnabled()

l  ……

l  isTraceEnabled()

在程序输出某种级别的日志消息之前,提倡先调用以上方法来判断该级别的日志是否允许输出,这有助于提高应用的性能。例如以下代码先把日志消息添加到StringBuffer中,最后在调用日志器的debug()方法输出日志:

StringBuffer buf = new StringBuffer();

buf.append(“Login Successsul - ”);

buf.append(“Name:”);

buf.append(username);

log.debug(buf.toString());

对于以上代码,如果日志器实际上不允许输出DEBUG级别的日志,那么执行日志器的debug()方法不会输出任何消息,此时向 StringBuffer中添加消息的一大串操做都将是多余的。为了提高性能,可以合理的使用isDebugEnabled()方法,避免应用执行多余的 操作:

if(log.isDebugEnabled){

       StringBuffer buf = newStringBuffer();

buf.append(“Login Successsul - ”);

buf.append(“Name:”);

buf.append(username);

log.debug(bug.toString());

}

(二)LogFactory接口

org.apache.commons.logging.LogFactory接口提供了获得日志器实例的两个静态方法:

       public static LoggetLog(String name)throws LogConfigurationException;

       public static LoggetLog(Class class) throws LogConfigurationException;

第一个getLog()方法以name参数作为日志器的名字;第二个getLog()方法以class参数指定的类的名字作为日志器的名字,以下是第二个getLog()方法的一种实现方式:

public static Log getLog(Class class) throwsLogConfigurationException{

getLog(class.getName);    //call getLog(String name)

}

Log4J简介

在强调可重用组件的今天,除了自己从头到尾开发一个可重用的日志操作类名,Apache为我们提供了一个强有力的现成的日志操作包Log4J。

Log4J主要由三大组件构成:

l  Logger:负责生成日志,并能够对日志信息进行分类筛选,通俗地讲就是决定什么日志信息应该输出,什么日志信息应该被忽略

l  Appender:定义了日志信息输出的目的地,指定日志信息应该被输出到什么地方,这些地方可以是控制台、文件、网络设备等

l  Layout: 指定日志信息的输出格式

这个3个组件协同工作,使得开发者能够依据日志信息类别记录信息,并能够在程序运行期间,控制日志信息的输出格式以及日志存放地点。

一个Logger可以有多个Appender,这意味着日志信息可以同时输出到多个设备上,每个Appender都对应一种Layout,Layout决定了输出日志信息的格式。

假定根据实际需要,要求程序中的日志信息既能输出到程序运行的控制台下,又能输出到指定的文件中,并且当日志信息输出到控制台时 SimplLayout布局,当日志信息输出到文件时PatternLayout布局,此时Logger、Appender和Layout3个组件的关系 如图  

 

Appender组件
Log4J的Appender组件决定将日志信息输出到什么地方。日前Log4J的Appender支持将日志信息输出到以下的目的:

控制台(Console)

文件

GUI组件

一个logger可以同时对应多个Appender,也就是说,一个Logger的日志信息可以同时输出到多个目的地,例如:要为rootLogger配置两个Appender; 一个是file,一个是console,则可以采用如下配置代码:
   

log4j.rootLogger =WARN.file.console

log4j.appender.file=org.apache.log4jRollingFileAppender
    log4j.appender.file=log.txt

log4j.appender.console=org.apache.log4j.ConsoleAppender

 Layout组件
Layout组件用来决定日志的输出格式,它有以下几种类型

l  org.apache.log4j.HTMLLayout(以HTML表格形式布局)

l  org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

l  org.apache.log4j.SimpleLayout(包含日志信息级别和信息字符串)

l  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程和类别等信息)

Log4J的基本使用方法

在应用程序中使用Log4J,首先在一个配置文件中配置Log4j的各个组件,然后就可以在程序中通过Log4JAPI来操作日志

定义配置文件
Log4J由3个重要的组件构成:Logger、Appender和layout。Log4J支持在程序中以编程的方式设置这些组件,还支持通过配置文件来配置组件,后一种方式更为灵活。

Log4J支持两种配置文件格式,一种是XML格式,一种是Java属性文件,
1.配置Logger组件
  如果配置rootLogger,语法为

 Log4j.rootLogger=[priority],appenderName,appendName…

其中,priority是日志级别,可选值包括OFF,FATAL,ERROR,WARN,INFO,DEBUG和ALL.通过在这里定义了级别, 可以控制应用程序中相应级别的日志信息的开关,比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。

 appenderName指定Appender组件,用户可以同时指定多个Appender组件。
如果配置用户自己的Logger组件,语法为:

log4j.logger.loggerName=[priority],appenderName.appenderName…

2. 配置Appender组件

配置日志信息输出的目的地Appender,其语法为:

Log4j.appender.appenderName=fully.qualified.name.of.appender.class

Log4j.appender.appenderName.optionN=value1

….

Log4j.appender.appenderName.optionN=valueN

Log4J提供的Appender有以下几种:

l  org.apache.log4j.ConsoleAppender(控制台)

l  org.apache.log4j.FileAppender(文件)

l  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

l  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

l  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

3.配置Layout组件

配置Layout组件的语法为:

Log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1=value1
…..
log4j.appender.appenderName.layout.optionN=valueN

Log4J提供的Layout有以下几种:

l  org.apache.log4j.HTMLLayout(以HTML表格形式布局)

l  org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

l  org.apache.log4j.SimpleLayout(包含日志信息级别和信息字符串)

l  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程和类别等信息)

PatternLayout的格式

符   号

描    述

%r

自程序开始后消耗的毫秒数

%t

表示日志记录请求生成的线程

%p

表示日志信息级别

%d{}

日志信息产生时间

%c

日志消息所在的类名

%m%n

表示日志消息的内容

在程序中访问Log4J,需要用到Log4J的JAR文件。
在程序中使用Log4J包含以下过程:

l  获得日志记录器

l  读取配置文件,配置Log4J环境

l  输出日志信息

在helloapp应用中使用Log4J

如果在Web应用中使用Log4j,需要创建一个Log4J的配置文件并且配置log4J环境,然后就可以在其他Web应用组件中获取Logger对象并输出日志。

1.    创建Log4j. properties文件

(1) 将Log4J的JAR文件拷贝到以下目录
<CATALINA_HOME>/webapps/xxx/WEB-INF/lib

(2)创建Log4J的配置文件log4j.properties,它的存放目录为
<CATALINA_HOME>/webapps/xxx/WEB-INF/classes

log4j.rootLogger=INFO, console, file

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.file=org.apache.log4j.RollingFileAppender

log4j.appender.file.File=d:/Log/log.txt

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%t %p - %m%n

log4j.appender.file.layout=org.apache.log4j.HTMLLayout

log4j.appender.file.layout.ConversionPattern=%t %p - %m%n

2.创建用于配置Log4J环境的HelloAction

package hello;

……

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public final class HelloAction extends Action

{

       public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception

       {

              Log log = LogFactory.getLog("helloapplog");

              log. fatal("This is a fatal message");

              log. error("This is a error message");

              log. warn("This is a warn message");

              log. info("This is a info message");

              log. debug("This is a debug message");

              log. trace("This is a trace message");

             

if(log.isDebugEnabled())           

              log.debug("This is a debug message");

              if(log.isErrorEnabled())

              log.error("This is a error message");

              MessageResources message=getResources(request);

       …………

       }

}

3.在控制台中输出日志,查看我们的控制台

启动Tomcat服务器,访问http://localhost:8080/helloapp/login.jsp,当我们正确输入一个用户名地时候,我们就会在Tomcat服务器的控制台看到日志

在d:/Log/log.txt目录下会看到一个log.txt文件

小结

Log4J主要由3大组件构成:Logger、Appender和Layout。Logger控制日志信息的输出;Appender决定日志信息的 输出目的地;Layout决定日志信息的输出格式。Log4J允许用户在配置文件中灵活地配置这些组件。在程序中使用Log4J非常方便,只要先取得日志 记录器,然后读取配置文件并配置Log4J环境,接下来就可以在程序中任何需要输出日志的地方,调用Logger类的适当方法来生成日志。