使用Log4J进行日志操作

来源:互联网 发布:mac添加虚拟打印机 编辑:程序博客网 时间:2024/05/22 10:32

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

Log4J简介

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

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

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

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

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

在强调可重复组件开发的今天,除了靠自己从头到尾开发一个可重用的日志操作类外,Apache也为我们提供了一个强有力的现成的日志操作软件包Log4J。Log4J主要由以下3大组件构成:

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

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

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

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

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

Logger组件

Logger是Log4J的核心组件,它代表了Log4J的日志记录器,能够对日志信息进行分类筛选,决定什么日志信息应该被输出,什么日志信息应该被忽略。

Logger组件由org.apache.log4j.Logger类来实现,它提供了如下方法:

//创建及返回Logger实例的静态方法

public staticLogger getRootLoger();

public staticLogger getLogger(String name);

//打印各种类别的日志的方法

public voiddebug(Object message);

public void info(Object message);

public void warn(Object message);

public void error(Object message);

public void fatal(Object message);

//打印日志的通用方法

public void log(Priority p , Objectmessage);

可以在Log4J的配置文件中配置自己的Logger组件,例如以下代码配置了一个Logger组件,名为”helloappLogger”:

log4j.logger.helloappLogger=WARN

以上代码定义了一个Logger组件,名为”helloappLogger”,并为它分配了一个日志级别(priority),取值为”WARN”。一共有5种日志级别:FATAL、ERROR、WARN、INFO和DEBUG,其中FATAL的级别最高,接下来依次是ERROR、WARN、INFO和DEBUG。

为什么要对日志分级别呢?试想一下,我们在写程序的时候,为了调试程序,会在很多容易出错的地方输出大量的日志信息。当程序调试完毕后,不需要输出这些日志信息了,那怎么办呢?以前的做法是把每个程序中输出日志信息的代码删除。但对于大的应用程序,这种做法即费力又费时,几乎是不现实的。

Log4J采用日志级别机制,简化了控制日志输出的步骤。在获得了一个Logger的实例以后,可以调用以下方法之一输出日志信息。

fatal(Objectmessage):输出FATAL级别的日志信息。

error(Objectmessage):输出ERROR级别的日志信息。

warn(Objectmessage):输出WARN级别的日志信息。

info(Objectmessage):输出INFO级别的日志信息。

debug(Objectmessage):输出DEBUG级别的日志信息。

log(Priority p ,Object message):输出参数Priority指定级别的日志信息。

对于这些输出日志的方法,只有当它输出日志的级别大于或等于为Logger组件配置的日志级别时,这个方法才会被真正执行。对于以上配置的helloappLogger,它的日志级别为WARN,那么在程序中,它的fatal()、error()和warn()方法会被执行,而info()和debug()方法不会被执行。对于log()方法,只有当它的Priority类型的参数p指定的日志级别大于或等于WARN时,这个方法才会被执行。

假如不需要输出级别为WARN的日志信息,可以把helloappLogger组件的级别调高,比如调到ERROR或FATAL级别,这样WARN级别和以下级别的日志就不会输出了,这比修改源程序代码显然方便得多。

Appender组件

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

·  控制台(Console)。

·  文件(File)。

·  GUI组件(GUI component)。

·  远程套接字服务器(Remotesocket server)。

·  NT的事件记录器(NT Event Logger)。

·  远程UNIX Syslog守护进程(RemoteUNIX Syslog daemon)。

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

log4j.logger.helloappLogger=WARN,file,console

log4j.appender.file=org.appache.log4j.RollingFileAppender

log4j.appender.file.File=log.txt

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

Layout组件

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

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

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

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

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

SimpleLayout仅输出日志信息级别和信息字符串。PatternLayout可以让开发者依照ConversionPattern去定义输出格式。ConversionPattern有点像C语言的print打印函数,开发者可以通过一些预定义的符号来指定日志的内容和格式,符号说明如下表:

PatternLayout的格式

符号

描述

%r

自程序开始运行到输出当前日志所消耗的毫秒数

%t

表示输出当前日志的线程的名字

%p

表示日志的级别

%d

表示输出当前日志的日期

%c

表示输出当前日志的Logger的名字

%m%n

表示日志信息的内容

Logger组件的继承性

Log4J提供了一个rootLogger,它是所有Logger组件的“祖先”,以下是配置rootLogger的代码:

log4j.rootLogger=INFO,console

用户可以在配置文件中方便地配置存在继承关系的Logger组件,范式在符号“.”后面的Logger组件都会成为在符号“.”前面的Logger组件的子类。例如:

log4j.apache.helloappLogger=WARN

log4j.apache.helloappLogger.childLogger=,file

对于以上配置代码,childLogger就是hello啊飘飘Log个人的子类Logger组件。

Logger组件的继承关系有以下特点:

·  如果子类组件Logger组件没有定义日志级别,则将继承父类的日志级别。

·  如果子类Logger组件定义了日志级别,就不会继承父类的日志级别。

·  在默认的情况下,子类Logger组件会继承父类的左右Appender,把它们加入到自己的Appender清单中。

·  如果把子类Logger组件的additivity标志设为false,那么它就不会继承父类的Appender。additivity标志的默认值为true。

Log4J的基本使用方法

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

定义配置文件

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

Log4J支持两种配置文件格式:一种是XML格式的文件,一种是Java属性文件,采用“键=值”的形式。

1.配置Logger组件

如果配置rootLog个人,则语法为:

log4j.rootLogger=[priority],appenderName,appenderName,…

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

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

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

配置Appender组件

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

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

log4j.appender.appenderName.optiona1=value1

log4j.appender.appenderName.optionaN=valueN

Log4J提供的Appender有以下几种:

·  org.apache.log4j.ConsoleAppender(控制台)。

·  org.apache.log4j.FileAppender(文件)。

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

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

·  org.apache.log4j.WriterAppender(将日志信息作为数据流发送到任意指定的地方)。

配置Layout组件

配置Layout组件的语法为:

log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.optiona1=value1

log4j.appender.appenderName.layout.opertionN=valueN

Log4j提供的Layout有以下几种:

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

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

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

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

在程序中使用Log4J

在程序中使用Log4J,需要用到Log4J的JAR文件,Log4J的下载地址为http://logging.apache.org/log4j/2.x/download.html。在下载了Log4J的压缩文件后,可以解压得到JAR文件。

maven依赖:

<dependency>

    <groupId>log4j</groupId>

    <artifactId>log4j</artifactId>

    <version>1.2.17</version>

</dependency>

1.       读取配置文件,配置Log4J环境

使用Log4J,第一步就是读取配置文件。配置Log4J环境,有以下3种方法。

·  BasicConfigurator.configure():自动地快速地使用默认Log4J环境。

·  PropertyConfigurator.configure(String configFilename):读取使用Java属性格式的配置文件并配置Log4J环境。

·  DOMConfigurator.configure(String filename):读取XML形式的配置文件并配置Log4J环境。

获得日志记录器

在配置好Log4J环境后,第二步就是获取日志记录器,这个记录器负责控制日志信息的输出。如果要获得rootLogger,可以调用Logger类的静态方法getRootLogger():

Logger rootLogger=Logger.getRootLogger();

如果要取得用户自定义的Logger,可以调用Logger类的静态方法getLogger(Stringname):

LoggerhelloappLogger = Logger.getLogger(“log4j.logger.helloappLogger”);

输出日志信息

在以上两个必要步骤执行完毕后,就可以在程序代码中需要生成日志的地方,调用Logger的各种输出日志方法来输出不同级别的日志,例如:

helloappLogger.warn(“Thisis a log message from the ” + helloappLogger.getName());

0 0
原创粉丝点击