`
ahaoo0712
  • 浏览: 17547 次
  • 性别: Icon_minigender_1
  • 来自: 襄樊
社区版块
存档分类
最新评论

log4j 作用及用法

阅读更多

背景
对于有经验的开发者来说,日志记录的重要性显而易见。例如程序中的异常处理和安 全性都依赖于Logging的功能来帮助履行它们的指责。应用程序中的日志记录主要基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他 应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。经验表明日志记 录是开发周期中的重要组成部分。

最简单的做法就是在代码中嵌入许多的打印语句,但是这样打印语句会充斥代码的主体,显然不是一个好方法。因此,使用成熟的框架例如Log4j,则会更具灵活性。

Log4j简介
Log4j 框架是用 Java 语言编写的标准日志记录框架。作为 Jakarta 项目的一部分,它在 Apache 软件许可证(Apache Software License)下分发,以速度和灵活性为中心概念:Log4j 环境是完全可配置的,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、 UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

Log4j由三个重要的部件构成:记录器(Loggers)、输出源(Appenders)和布局(Layouts)。

记录器按照布局中指定的格式把日志信息写入一个或多个输出源。输出源可以是控制台、文本文件、XML文件或Socket,甚至还可以把信息写入到Windows事件日志或通过电子邮件发送。我们可以通过配置文件来部署这些组件。

其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。本文从描述 log4j 体系结构的主要组件着手。然后是描述基本用法和配置的简单示例。

定义配置文件
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:

一、 配置记录器。

Log4j允许程序员定义多个记录器,每个记录器有自己的名字。但有一个记录器叫根记录器,它永远存在,且不能通过名字检索或引用,在配置文件中,可以如下定义根记录器:

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

Level是记录器的级别,它是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别:ERROR、WARN、INFO、DEBUG:

  DEBUG  <  INFO  <  WARN  <  ERROR  <  FATAL

右边的级别比左边的高。如果一条log信息的级别,大于等于记录器的级别值,那么记录器就会记录它。例如level被设置为INFO级别,那么应用程序中所有的DEBUG的日志信息将不被打印出来。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。

appenderName是输出源的名字,它指定日志信息输出到哪个地方。您可以为一个记录器指定多个输出源。

在一些配置文件中,你可能会看到下面的语句:

  log4j.rootCategory = [ level ] , appenderName, appenderName, … 

在早期的Log4j版本中,org.apache.Category实现了记录器的功能,为了提高向后兼容 性,Logger扩展了Category,因此rootCategory和rootLogger是可以互换的,但最后Category将从类库中删除,因 此请使用Logger类。

除了根记录器之外,log4j允许程序员定义多个记录器,每个记录器有自己的名字:

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

在Log4J中Logger是具有层次关系的,Log4j支持配置的记录器之间的“父子关系”,记录器之间 通过名字来表明隶属关系(或家族关系),它们有一个共同的根,位于最上层,其它Logger遵循类似包的层次:记录器a.b,与记录器a.b.c之间是父 子关系,而记录器a与a.b.c之间是祖先与后代的关系。例如:

    static Logger root = Logger.getRootLogger();
       static Logger log1 = Logger.getLogger("cc");
       static Logger log2 = Logger.getLogger("cc.ejb");
       static Logger log3 = Logger.getLogger("cc.ejb.my.TestApp");
上面代码中,log1是log2的父亲,是log3的祖先,而root是所有log1、log2、 log3的祖先,它们都从root中继承。所以,一般情况下,仅需要配置好rootLogger,其它子记录器都会从中继承rootLogger的配置。 如果修改了rootLogger的配置,其它所有的子记录器也会继承这种变化。这样就大大地方便了配置。
如果一个应用中包含了上千个类都需要日志,那么我们是否需要配置上千个Logger呢?我们通过一个简 单的办法来解决这个问题: 用每一个java类文件名(包含该类的包名)定义一个记录器,这是一种有用并且直观的记录器实例名的定义方式。例如在配置文件 中定义了一个com.foo的记录器:
  log4j.logger.com.foo=WARN
在com.foo中的一个java类bar,我们通过其本类的名字获得一个记录器“com.foo.Bar”:

package com.foo; class Bar{ static Logger log=Logger.getLogger(bar.Class.getName()); ..... }

由于记录器com.foo.Bar 没有指定的级别,它从com.foo(在配置文件中其级别设置成WARN) 继承级别。并且这样我们就能方便的从大量log信息中判断出它们各自的来源。当然了,这不是硬性规定的,实际上Log4j没有对设置记录器的实例名做什么 限制,程序员可以根据自己的喜好随意定义。

二、日志信息输出源Appender
log4j 还允许日志记录请求打印到多个输出目的地,按 log4j 的叫法是输出源。一个记录器可以有多个输出源。一条log信息如果可被这个记录器处理,则该记录器会把这条信息送往每个它所拥有的输出源,以及层次结构中 更高级的输出源。例如,根记录器以控制台作为输出源,则所有可被纪录的日志都将至少打印到控制台。

配置日志信息输出源,其语法为:

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

  log4j.appender.appenderName.option1 = value1   …   log4j.appender.appenderName.option = valueN

Log4j提供的appender有以下几种:

  • org.apache.log4j.ConsoleAppender(控制台)
  • org.apache.log4j.FileAppender(文件)
  • org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  • org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  • org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
  • org.apache.log4j.SocketAppender (Socket)
  • org.apache.log4j.NtEventLogAppender    (NT的Event Log)
  • org.apache.log4j.JMSAppender   (电子邮件)

请注意,可以通过覆盖缺省行为,这样就不再附加累积的输出源:

  log4j.additivity.loggerName=false

注意,不要把一个输出源附加到多个记录器上,否则会得到“Attempted to append to closed appender named xxx”的信息。


三、配置日志信息的格式(布局),其语法为:

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

其中,Log4j提供的layout有以下几种:

  • org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  • org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

如果采用了PatternLayout, 则Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

  • %m 输出代码中指定的消息
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r 输出自应用启动到输出该log信息耗费的毫秒数
  • %c 输出所属的类目,通常就是所在类的全名
  • %t 输出产生该日志事件的线程名
  • %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

四、例子
下面是一个完整的Log4j配置文件,这个配置文件指定了两个输出源stdout和R。前 者把日志信息输出到控制台,后者是一个轮转日志文件。最大的文件是100KB,当一个日志文件达到最大尺寸时,Log4J会自动把example.log 重命名为example.log.1,然后重建一个新的example.log文件,依次轮转。

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.FileAppender log4j.appender.stdout.File=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.cc.ejb.my=error,out log4j.appender.out=org.apache.log4j.ConsoleAppender log4j.appender.out.layout=org.apache.log4j.PatternLayout log4j.appender.out.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.cc.ejb.my.son=debug log4j.additivity.cc.ejb.my.son=false

在代码中使用Log4j

一、得到记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:

  public static Logger getLogger( String name) 

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

二、读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

  //自动快速地使用缺省Log4j环境。 BasicConfigurator.configure (); //读取使用Java的特性文件编写的配置文件   PropertyConfigurator.configure ( String configFilename); //读取XML形式的配置文件   DOMConfigurator.configure ( String filename );

三、插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

  Logger.debug ( Object message ) ;
  Logger.info ( Object message ) ;
  Logger.warn ( Object message ) ;
  Logger.error ( Object message ) ;

四、例子

我们通过下面这个简单的例子,来演示在程序如何使用Log4j,您可以修改配置文件以得到不同日志信息。

package cc.ejb.my; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import my.son.Foo; public class TestApp {

    static Logger logger=Logger.getLogger(TestApp.class.getName());

    public static void main(String[] args) {                 PropertyConfigurator.configure("log4j.properties");         logger.info("Applcaiton Starts");         logger.warn("Bar Starts");         Bar bar=new Bar();         logger.error("Bar Errors");         bar.doIt();         logger.warn("Bar Exits");         logger.info("Foo Starts");         Foo foo=new Foo();         logger.error("Foo Errors");         foo.doit();         logger.warn("Foo exits ");         logger.info("Applcaition Exits");             }

}

class Bar {     static Logger logger = Logger.getLogger(Bar.class.getName());     public void doIt() {       logger.debug("Did it again!");     } }

package cc.ejb.my.son;

import org.apache.log4j.Logger;

public class Foo {     private Logger log=Logger.getLogger(Foo.class.getName());     public Foo() {         log.info("Foo Initialzie");     }     public void doit()     {         log.debug("Do it in Foo");     }

}

分享到:
评论

相关推荐

    log4j经典用法

    ### log4j经典用法详解 #### 一、概述 `log4j`是一款非常流行的开源日志框架,由Apache出品。它具有高度灵活的配置机制,并且支持多种日志输出方式,使得开发者可以根据项目的实际需求来定制日志输出级别、格式...

    log4j.rar及用法

    本文将深入探讨Log4j的核心功能、使用方法以及如何在项目中集成和配置。** ### 1. Log4j简介 Log4j是由Apache软件基金会开发的一个开源日志组件,主要目标是提供一个轻量级、高效且易于使用的日志服务。它支持多种...

    log4j简述(架构、用法等)

    ### Log4j 架构与用法详解 #### 一、Log4j 概述 Log4j 是一款由 Apache 软件基金会维护的开放源代码项目,它提供了强大的日志记录功能,广泛应用于 Java 应用程序的开发过程中。自 1996 年以来,Log4j 经历了不断...

    Log4j简介 介绍log4j的原理和用法

    log4j的使用习惯,让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息 ,使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一...

    log4j文档及使用

    本文将围绕“log4j文档及使用”这一主题,深入探讨其核心概念、配置方式以及实战应用。 首先,Log4j的核心理念是提供一种灵活的日志记录机制,允许开发者控制日志信息的级别(如DEBUG、INFO、WARN、ERROR和FATAL)...

    log4j多个简单实例

    本篇文章将深入探讨Log4j的多个简单实例,帮助你理解和掌握其基本用法。 首先,Log4j由三个主要组件构成:配置器(Configuration)、日志器(Logger)和布局(Layout)。配置器定义了日志信息的输出格式和位置;...

    log4j和log4j .jar包

    **Log4j简介** Log4j是Apache组织提供的一款开源日志记录框架,它为Java应用程序提供了灵活且强大的日志处理能力。Log4j的主要目标是简化...通过阅读`log4j知识.doc`文档,可以深入学习Log4j的详细用法和最佳实践。

    log4j实例,log4j-1.2.9.jar

    用户可以通过解压这个文件来获取Log4j的库文件,以便在项目中引用,并查看示例以了解其用法。 **6. 版本差异** 尽管Log4j现在已经有更新的版本,如Log4j2,但老版本依然有价值。每个版本都有其特定的特性、改进和...

    log4j帮助文档及实例

    本文将深入探讨Log4j的帮助文档及实例,帮助你更好地理解和应用Log4j。** **一、Log4j简介** Log4j是一个开源的日志记录工具,最初由Ceki Gülcü设计。它的主要目标是为Java应用程序提供灵活、高效和可配置的日志...

    log4j 源码包 日志包 2.11.0

    通过对Log4j 2.11.0源码的深入研究,开发者不仅可以掌握其基本用法,还能了解其背后的实现机制,从而更好地利用这一强大的工具,提升开发效率,优化系统性能。同时,源码学习也是提升编程技能的重要途径,能帮助...

    Log4j记录日志DEMO

    通过上述步骤,你已经掌握了Log4j的基本用法。在实际项目中,根据需求调整配置,可以实现灵活且高效的日志管理。在`Log4jDemo`中,你可以看到这些概念的具体应用,进一步了解Log4j的日志记录过程。

    log4j简单demo

    本示例将引导你快速了解并掌握Log4j的基本用法。 **Log4j组件介绍** 1. **配置文件(Config File)**:Log4j的核心在于其配置文件,通常为`log4j.properties`或`log4j.xml`。这个文件定义了日志输出的级别、格式、...

    log4j包的使用说明及api帮助文档

    `3.log4j日志包的用法.docx`可能是一份关于如何在项目中使用log4j的指南,包括配置和代码示例。`log4j包的使用说明及api帮助文档`可能是更全面的教程,包含了更多实践指导和最佳实践。 总的来说,log4j为Java开发者...

    Log4J日志代码

    Log4J是Java编程语言中广泛使用的日志记录框架,由Apache软件基金会开发。它提供了一个灵活的日志...在提供的"Log4JTest"文件中,可能包含了使用Log4J进行日志记录的示例代码,可以帮助初学者更直观地理解Log4J的用法。

    log4j使用总结

    Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 在配置文件中,我们可以定义多个日志信息输出目的地,例如...

    深入学习log4J

    总的来说,《深入学习log4J》这本书会全面讲解Log4J的各项特性和用法,包括配置文件的编写、数据库日志的实现以及框架级别的日志封装。通过学习,读者不仅可以掌握Log4J的基本操作,还能理解如何在实际项目中有效地...

    log4j的配置示例

    **标题:“log4j的配置示例”** **描述:“简单的log4j测试工程”** 在Java开发中,日志管理是一项...通过学习这个示例,开发者可以快速掌握Log4j的基本用法,并将其应用到自己的项目中,实现高效、可控的日志管理。

    log4j小测试

    这个"Log4j小测试"很可能是初学者为了理解Log4j的基本用法而创建的一个简单示例项目。下面将详细解释Log4j的核心概念和如何在实际应用中使用。 1. **配置文件**:Log4j的核心在于其配置文件,通常是`log4j....

    Log4j详解与实战

    **Log4j详解与实战** Log4j是Java平台上的一个广泛应用的日志框架,...在"Log4j详解与实战.pdf"文档中,你将找到更多关于Log4j的详细信息,包括其配置、API用法、最佳实践等内容,对于深入理解和使用Log4j非常有帮助。

    log4j应用的一个例子

    本教程将通过一个实际的"Log4j应用例子"来深入讲解Log4j的基本用法和配置。 **1. Log4j的组件** Log4j主要包括三个核心组件:Logger(日志器)、Appender(输出端)和Layout(格式化器)。 - **Logger**: 日志器...

Global site tag (gtag.js) - Google Analytics