<!DOCTYPE html>
<html>
<head>
<title>MyHtml.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body bgcolor="">
<h1 align="center">log4j作用和基本配置</h1>
<div></div>
<div>
<div id="">
<div id="">
<h2>背景</h2>
<br>
<p> 对于有经验的开发者来说,日志记录的重要性显而易见。例如程序中的异常处理和安 全性都依赖于Logging的功能来帮助履行它们的指责。应用程序中的日志记录主要基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他 应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。经验表明日志记 录是开发周期中的重要组成部分。</p>
<p> 最简单的做法就是在代码中嵌入许多的打印语句,但是这样打印语句会充斥代码的主体,显然不是一个好方法。因此,使用成熟的框架例如Log4j,则会更具灵活性。</p>
<h2>Log4j简介</h2>
Log4j 框架是用 Java 语言编写的标准日志记录框架。作为 Jakarta 项目的一部分,它在 Apache 软件许可证(Apache Software License)下分发,以速度和灵活性为中心概念:Log4j 环境是完全可配置的,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、 UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
<p> Log4j由三个重要的部件构成:记录器(Loggers)、输出源(Appenders)和布局(Layouts)。</p>
<p> 记录器按照布局中指定的格式把日志信息写入一个或多个输出源。输出源可以是控制台、文本文件、XML文件或Socket,甚至还可以把信息写入到Windows事件日志或通过电子邮件发送。我们可以通过配置文件来部署这些组件。</p>
<p> 其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。本文从描述 log4j 体系结构的主要组件着手。然后是描述基本用法和配置的简单示例。</p>
<p> 定义配置文件 Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:</p>
<h3> 一、 配置记录器</h3>
<p> Log4j允许程序员定义多个记录器,每个记录器有自己的名字。但有一个记录器叫根记录器,它永远存在,且不能通过名字检索或引用,在配置文件中,可以如下定义根记录器:</p>
<pre> log4j.rootLogger = [ level ] , appenderName, appenderName, … </pre>
<p> Level是记录器的级别,它是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别:ERROR、WARN、INFO、DEBUG:</p>
<pre> DEBUG < INFO < WARN < ERROR < FATAL</pre>
<p> 右边的级别比左边的高。如果一条log信息的级别,大于等于记录器的级别值,那么记录器就会记录它。例如level被设置为INFO级别,那么应用程序中所有的DEBUG的日志信息将不被打印出来。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。</p>
<p> appenderName是输出源的名字,它指定日志信息输出到哪个地方。您可以为一个记录器指定多个输出源。</p>
<p> 在一些配置文件中,你可能会看到下面的语句:</p>
<pre> log4j.rootCategory = [ level ] , appenderName, appenderName, … </pre>
<p> 在早期的Log4j版本中,org.apache.Category实现了记录器的功能,为了提高向后兼容 性,Logger扩展了Category,因此rootCategory和rootLogger是可以互换的,但最后Category将从类库中删除,因 此请使用Logger类。</p>
<p> 除了根记录器之外,log4j允许程序员定义多个记录器,每个记录器有自己的名字:</p>
<pre> log4j.logger.loggerName = [ level ] , appenderName, appenderName, … </pre>
<p> 在Log4J中Logger是具有层次关系的,Log4j支持配置的记录器之间的“父子关系”,记录器之间 通过名字来表明隶属关系(或家族关系),它们有一个共同的根,位于最上层,其它Logger遵循类似包的层次:记录器a.b,与记录器a.b.c之间是父 子关系,而记录器a与a.b.c之间是祖先与后代的关系。例如:</p>
<pre> static Logger root = Logger.getRootLogger();<br> static Logger log1 = Logger.getLogger("cc");<br> static Logger log2 = Logger.getLogger("cc.ejb");<br> static Logger log3 = Logger.getLogger("cc.ejb.my.TestApp");</pre>
<div></div>
<div> 上面代码中,log1是log2的父亲,是log3的祖先,而root是所有log1、log2、 log3的祖先,它们都从root中继承。所以,一般情况下,仅需要配置好rootLogger,其它子记录器都会从中继承rootLogger的配置。 如果修改了rootLogger的配置,其它所有的子记录器也会继承这种变化。这样就大大地方便了配置。</div>
<div></div>
<div> 如果一个应用中包含了上千个类都需要日志,那么我们是否需要配置上千个Logger呢?我们通过一个简 单的办法来解决这个问题: 用每一个java类文件名(包含该类的包名)定义一个记录器,这是一种有用并且直观的记录器实例名的定义方式。例如在配置文件 中定义了一个com.foo的记录器:</div>
<div>
<pre> log4j.logger.com.foo=WARN</pre>
</div>
<div> 在com.foo中的一个java类bar,我们通过其本类的名字获得一个记录器“com.foo.Bar”:</div>
<div>
<p> package com.foo;</p>
<p> class Bar{</p>
<p> static Logger log=Logger.getLogger(bar.Class.getName()); .....
<p> }</p>
</div>
<p> 由于记录器com.foo.Bar 没有指定的级别,它从com.foo(在配置文件中其级别设置成WARN) 继承级别。并且这样我们就能方便的从大量log信息中判断出它们各自的来源。当然了,这不是硬性规定的,实际上Log4j没有对设置记录器的实例名做什么 限制,程序员可以根据自己的喜好随意定义。</p>
<h3> 二、日志信息输出源Appender</h3>
<br>
<p> log4j 还允许日志记录请求打印到多个输出目的地,按 log4j 的叫法是输出源。一个记录器可以有多个输出源。一条log信息如果可被这个记录器处理,则该记录器会把这条信息送往每个它所拥有的输出源,以及层次结构中 更高级的输出源。例如,根记录器以控制台作为输出源,则所有可被纪录的日志都将至少打印到控制台。</p>
<p> 配置日志信息输出源,其语法为:</p>
<p> log4j.appender.appenderName = fully.qualified.name.of.appender.class</p>
<p> log4j.appender.appenderName.option1 = value1 …</p>
<p> log4j.appender.appenderName.option = valueN</p>
<p> Log4j提供的appender有以下几种:</p>
<ul>
<li> org.apache.log4j.ConsoleApp