﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-希望与大家一起分享Java-文章分类-Log4j技术</title><link>http://www.blogjava.net/haoqingshi/category/2770.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 09:11:05 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 09:11:05 GMT</pubDate><ttl>60</ttl><item><title>Log4j 学习笔记(转贴)</title><link>http://www.blogjava.net/haoqingshi/articles/21948.html</link><dc:creator>Java&amp;Inter</dc:creator><author>Java&amp;Inter</author><pubDate>Wed, 30 Nov 2005 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/haoqingshi/articles/21948.html</guid><wfw:comment>http://www.blogjava.net/haoqingshi/comments/21948.html</wfw:comment><comments>http://www.blogjava.net/haoqingshi/articles/21948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/haoqingshi/comments/commentRss/21948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/haoqingshi/services/trackbacks/21948.html</trackback:ping><description><![CDATA[<TABLE class=main width="100%" align=center>
<TBODY>
<TR>
<TD align=middle>
<TABLE class=title-bg align=center>
<TBODY>
<TR class=title>
<TD noWrap align=middle><FONT size=+1><B>Log4j 学习笔记</B></FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD noWrap align=middle><BR>by heavyz<BR>2003-04-15<BR><BR></TD></TR>
<TR>
<TD>
<TABLE class=intro-bg cellSpacing=1 align=center>
<TBODY>
<TR class=main>
<TD align=middle>
<HR noShade SIZE=1>
</TD></TR>
<TR class=main>
<TD>
<TABLE class=main cellSpacing=0 width="90%" align=center>
<TBODY>
<TR>
<TD>
<P>
<CENTER><IMG src="http://zooo.51.net/heavyz_cs/notebook/res/log4j-logo.jpg" onload="java_script_:if(this.width>500)this.width=500"></CENTER>
<P></P>
<P>
<CENTER>Log4j主页：<A href="http://jakarta.apache.org/log4j">http://jakarta.apache.org/log4j</A> </CENTER>
<P></P></TD></TR></TBODY></TABLE></TD></TR>
<TR class=main>
<TD align=middle>
<HR noShade SIZE=1>
</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Index</B></TD></TR>
<TR class=main>
<TD>
<P>
<OL>
<LI>Log4j的类图 
<LI>Logger：日志写出器 
<OL>
<LI>Logger的输出方法 
<LI>Logger的命名规则 
<LI>Log level 
<LI>示例代码 
<LI>关于logger的两点说明 </LI></OL>
<LI>Appender：日志目的地 
<OL>
<LI>ConsoleAppender 
<LI>FileAppender 
<LI>RollingFileAppender </LI></OL>
<LI>Layout：日志格式化器 
<OL>
<LI>PatternLayout 
<LI>patterns in PatternLayout </LI></OL>
<LI>Configuration：配置 
<OL>
<LI>默认的log4j初始化过程 
<LI>BasicConfigurator.configure() 
<LI>xml格式的log4j配置文件概述 
<LI>在xml文件中配置appender和layout 
<LI>我自己的一个使用xml文件配置log4j环境的很简单的例子 </LI></OL>
<LI>Log4j的编码习惯 
<LI>参考资料 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Log4j的类图</B></TD></TR>
<TR class=main>
<TD>
<P>
<CENTER><IMG src="http://zooo.51.net/heavyz_cs/notebook/res/log4j-classes.gif" onload="java_script_:if(this.width>500)this.width=500"></CENTER>
<P></P>
<P>
<OL>
<LI>Logger - 日志写出器，供程序员输出日志信息 
<LI>Appender - 日志目的地，把格式化好的日志信息输出到指定的地方去 
<OL>
<LI>ConsoleAppender - 目的地为控制台的Appender 
<LI>FileAppender - 目的地为文件的Appender 
<LI>RollingFileAppender - 目的地为大小受限的文件的Appender </LI></OL>
<LI>Layout - 日志格式化器，用来把程序员的logging request格式化成字符串 
<OL>
<LI>PatternLayout - 用指定的pattern格式化logging request的Layout </LI></OL></LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Logger：日志写出器</B></TD></TR>
<TR class=main>
<TD>
<P><TT>Logger</TT>对象是用来取代<TT>System.out</TT>或者<TT>System.err</TT>的日志写出器，用来供程序员输出日志信息。</P>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>Logger的输出方法</B></TD></TR>
<TR class=main>
<TD>
<P>Logger类对象提供一系列方法供程序员输出日志信息。</P>
<P><TT><PRE>        
<B>
        ------ Log4j APIs : class Logger ------
        </B>
        
        <FONT color=green>
        // Printing methods :
        </FONT>
        public void debug(Object msg);
        public void debug(Object msg, Throwable t);
        
        public void info(Object msg);
        public void info(Object msg, Throwable t);
        
        public void warn(Object msg);
        public void warn(Object msg, Throwable t);
        
        public void error(Object msg);
        public void error(Object msg, Throwable t);
        
        public void fatal(Object msg);
        public void fatal(Object msg, Throwable t);
        <FONT color=green>
        // Generic printing method :
        </FONT>
        public void log(Level l, Object msg);
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>Logger的命名规则</B></TD></TR>
<TR class=main>
<TD>
<P>Logger由一个String类的名字识别，logger的名字是大小写敏感的，且名字之间具有继承的关系，子名有父名作为前缀，用点号<B>.</B>分隔。如：<TT>x.y</TT>是<TT>x.y.z</TT>的父亲。</P>
<P>根logger (<TT>root logger</TT>)是所有logger的祖先，它具有如下属性：<B>1)</B> 它总是存在的；<B>2)</B> 它不可以通过名字获得。</P>
<P>通过调用<TT>public static Logger Logger.getRootLogger()</TT>获得<TT>root logger</TT>；通过调用<TT>public static Logger Logger.getLogger(String name)</TT>或者<TT>public static Logger Logger.getLogger(Class clazz)</TT>获得（或者创建）一个<TT>named logger</TT>。后者相当于调用<TT>Logger.getLogger(clazz.getName())</TT>。</P>
<P>在某对象中，用该对象所属的类为参数，调用<TT>Logger.getLogger(Class clazz)</TT>以获得logger被认为是目前所知的最理智的命名logger的方法。</P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>Log level</B></TD></TR>
<TR class=main>
<TD>
<P>每个logger都被分配了一个日志级别 (<TT>log level</TT>)，用来控制日志信息的输出。未被分配level的logger将继承它最近的父logger的level。</P>
<P>每条输出到logger的日志请求(<TT>logging request</TT>)也都有一个level，如果该request的level大于等于该logger的level，则该request将被处理（称为enabled）；否则该request将被忽略。故可得知： 
<OL>
<LI>logger的level越低，表示该logger越详细 
<LI>logging request的level越高，表示该logging request越优先输出 </LI></OL>
<P></P>
<P><TT>Level</TT>类中预定义了五个level，它们的大小关系如下：</P>
<P><TT><PRE>        Level.ALL &lt; Level.DEBUG &lt; Level.INFO &lt; Level.WARN &lt; Level.ERROR &lt; Level.FATAL &lt; Level.OFF
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>示例代码</B></TD></TR>
<TR class=main>
<TD>
<P>以下代码将用自己所属的类为参数，创建一个logger，启用默认配置，设置其level并向其输出若干logging request。</P>
<P><TT><PRE>import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;

public class Log4jTest {
    public static void main(String argv[]) {
    
        <FONT color=green>
        // Create a logger by the name of class Log4jTest.
        </FONT>
        Logger logger = Logger.getLogger(Log4jTest.class);
        <FONT color=green>
        // Use the default configuration.
        </FONT>
        BasicConfigurator.configure();
        <FONT color=green>
        // Set the logger level to Level.INFO
        </FONT>
        logger.setLevel(Level.INFO);
        <FONT color=green>
        // This request will be disabled since Level.DEBUG &lt; Level.INFO.
        </FONT>          
        logger.debug("This is debug.");
        <FONT color=green>
        // These requests will be enabled.
        </FONT>          
        logger.info("This is an info.");
        logger.warn("This is a warning.");
        logger.error("This is an error.");
        logger.fatal("This is a fatal error.");
        
        return;
    }
}
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>关于logger的两点说明</B></TD></TR>
<TR class=main>
<TD>
<P>
<OL>
<LI>用同名参数调用<TT>Logger.getLogger(String name)</TT>将返回同一个logger的引用。故可以在一个地方配置logger，在另外一个地方获得配置好的logger，而无须相互间传递logger的引用。 
<LI>logger的创建可以按照任意的顺序，即，父logger可以后于子logger被创建。log4j将自动维护logger的继承树。 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Appender：日志目的地</B></TD></TR>
<TR class=main>
<TD>
<P>每个logger都可以拥有一个或者多个appender，每个appender表示一个日志的输出目的地，比如console或者某个文件。可以使用<TT>Logger.addAppender(Appender app)</TT>为logger增加一个appender；可以使用<TT>Logger.removeAppender(Appender app)</TT>为logger移除一个appender。</P>
<P>默认情况下，logger的additive标志被设置为true，表示子logger将继承父logger的所有appenders。该选项可以被重新设置，表示子logger将不再继承父logger的appenders。</P>
<P><TT>root logger</TT>拥有目标为<TT>system.out</TT>的<TT>consoleAppender</TT>，故默认情况下，所有的logger都将继承该appender。</P>
<P><TT><PRE>      
<B>
      ------ Log4j APIs : class Logger ------
      </B>
      
      <FONT color=green>
      // 为logger对象增加或者移除一个Appender对象 :.
      </FONT>
      public void appAppender(Appender app);
      public void removeAppender(Appender app);
      <FONT color=green>
      // 获得和设置additive标志：是否继承父logger的appenders :.
      // <B>注意：</B>在设置additive标志为false时，必须保证已经为该logger设置了新的appender， :.
      // 否则log4j将报错：log4j:WARN No appenders could be found for logger (x.y.z). :.
      </FONT>
      public boolean getAdditivity();
      public void setAdditivity(boolean additive);
    </PRE></TT>
<P></P>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>ConsoleAppender</B></TD></TR>
<TR class=main>
<TD>
<P>可以使用<TT>ConsoleAppender</TT>对象把日志输出到控制台。每个<TT>ConsoleAppender</TT>都有一个<TT>target</TT>，表示它的输出目的地。它可以是<TT>System.out</TT>，标准输出设备（缓冲显示屏）；或者是<TT>System.err</TT>，标准错误设备（不缓冲显示屏）。<TT>ConsoleAppender</TT>的使用方法参考如下API :.</P>
<P><TT><PRE>        
<B>
        ------ Log4j APIs : class ConsoleAppender extends WriterAppender ------
        </B>
      
        <FONT color=green>
        // 构造方法，使用一个Layout对象构造一个ConsoleAppender对象 :.
        // 默认情况下，ConsoleAppender的target是System.out :.
        </FONT>
        public ConsoleAppender(Layout layout);
        <FONT color=green>
        // 构造方法，使用一个Layout对象和一个target字符串构造ConsoleAppender对象 :.
        // target的可能取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR :.
        </FONT>
        public ConsoleAppender(Layout layout, String target);
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>FileAppender</B></TD></TR>
<TR class=main>
<TD>
<P>可以使用<TT>FileAppender</TT>对象把日志输出到一个指定的日志文件中去。使用方法可以参考如下的API :.</P>
<P><TT><PRE>        
<B>
        ------ Log4j APIs : class FileAppender extends WriterAppender ------
        </B>
      
        <FONT color=green>
        // 构造方法，使用一个Layout对象和日志文件名构造一个FileAppender对象 :.
        </FONT>
        public FileAppender(Layout layout, String filename)
            throws IOException;
        public FileAppender(Layout layout, String filename, boolean append)
            throws IOException;
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>RollingFileAppender</B></TD></TR>
<TR class=main>
<TD>
<P>可以使用<TT>FileAppender</TT>的子类<TT>RollingFileAppender</TT>对象，把日志输出到一个指定的日志文件中。不同的是该日志文件的大小受到限制，当日志内容超出最大的尺寸时，该文件将向上滚动（最老的日志被擦除）。还可以在该类对象中指定为日志文件做多少个备份。具体使用方法参考如下API :.</P>
<P><TT><PRE>        
<B>
        ------ Log4j APIs : class RollingFileAppender extends FileAppender ------
        </B>
      
        <FONT color=green>
        // 构造方法，使用一个Layout对象和日志文件名构造一个RollingFileAppender对象 :.
        </FONT>
        public RollingFileAppender(Layout layout, String filename)
            throws IOException;
        public RollingFileAppender(Layout layout, String filename, boolean append)
            throws IOException;
        <FONT color=green>
        // 获得和设置日志备份文件的个数 :.
        </FONT>
        public int getMaxBackupIndex();
        public void setMaxBackupIndex(int index);
        <FONT color=green>
        // 获得和设置滚动日志文件的最大尺寸 :.
        </FONT>
        public long getMaximumFileSize();
        public void setMaximumFileSize(long size);
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Layout：日志格式化器</B></TD></TR>
<TR class=main>
<TD>
<P>每个appender都和一个layout相联系；layout的任务是格式化用户的logging request，appender的任务是把layout格式化好的输出内容送往指定的目的地。</P>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>PatternLayout</B></TD></TR>
<TR class=main>
<TD>
<P><TT>PatternLayout</TT>是Layout的一个子类，用来使用类似C语言的<TT>printf</TT>函数中使用的格式控制字符串来控制日志的输出格式。使用方法参考如下API :.</P>
<P><TT><PRE>        
<B>
        ------ Log4j APIs : class PatternLayout extends Layout ------
        </B>
      
        <FONT color=green>
        // 无参数构造方法，使用DEFAULT_CONVERSION_PATTERN构造一个PatternLayout :.
        // <B>注意：</B>DEFAULT_CONVERSION_PATTERN为"%m%n"，只打印消息信息 :.
        </FONT>
        public PatternLayout();
        <FONT color=green>
        // 构造方法，使用自定义的pattern构造一个PatternLayout :.
        </FONT>
        public PatternLayout(String pattern);
        <FONT color=green>
        // 获得和设置PatternLayout对象的日志pattern :.
        </FONT>
        public String getConversionPattern();
        public void setConversionPattern(String pattern);
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>patterns in PatternLayout</B></TD></TR>
<TR class=main>
<TD>
<P><FONT color=#ff0000>未完待续</FONT> </P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Configuration：配置</B></TD></TR>
<TR class=main>
<TD>
<P>对log4j环境的配置就是对root logger的配置，包括把root logger设置为哪个级别(level)；为它增加哪些appender，等等。这些可以通过设置系统属性的方法来隐式地完成，也可以在程序里调用<TT>XXXConfigurator.configure()</TT>方法来显式地完成。</P>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>默认的log4j初始化过程</B></TD></TR>
<TR class=main>
<TD>
<P><TT>Logger</TT>类的静态初始化块(<TT>static initialization block</TT>)中对log4j的环境做默认的初始化。<B>注意：</B>如果程序员已经通过设置系统属性的方法来配置了log4j环境，则不需要再显式地调用<TT>XXXConfigurator.configure()</TT>方法来配置log4j环境了。</P>
<P>Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下： 
<OL>
<LI>检查系统属性<TT>log4j.defaultInitOverride</TT>，如果该属性被设置为false，则执行初始化；否则（只要不是false，无论是什么值，甚至没有值，都是否则），跳过初始化。 
<LI>把系统属性<TT>log4j.configuration</TT>的值赋给变量resource。如果该系统变量没有被定义，则把resource赋值为<TT>"log4j.properties"</TT>。<B>注意：</B>在apache的log4j文档中建议使用定义<TT>log4j.configuration</TT>系统属性的方法来设置默认的初始化文件是一个好方法。 
<LI>试图把resource变量转化成为一个<TT>URL</TT>对象<TT>url</TT>。如果一般的转化方法行不通，就调用<TT>org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)</TT>方法来完成转化。 
<LI>如果<TT>url</TT>以".html"结尾，则调用方法<TT>DOMConfigurator.configure(url)</TT>来完成初始化；否则，则调用方法<TT>PropertyConfigurator.configure(url)</TT>来完成初始化。如果<TT>url</TT>指定的资源不能被获得，则跳出初始化过程。 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>BasicConfigurator.configure()</B></TD></TR>
<TR class=main>
<TD>
<P><TT>BasicConfigurator.configure()</TT>方法使用最简的方法配置log4j环境。<B>注：</B>所谓配置log4j环境，就是指配置root logger，因为所有其它的logger都是root logger的后代，所以它们（默认情况下）都将继承root logger的性质。</P>
<P><TT>BasicConfigurator.configure()</TT>完成的任务是： 
<OL>
<LI>用默认pattern创建PatternLayout对象p：<BR>PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n"); 
<LI>用p创建ConsoleAppender对象a，目标是system.out，标准输出设备：<BR>ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); 
<LI>为root logger增加一个ConsoleAppender p：<BR>rootLogger.addAppender(p); 
<LI>把root logger的log level设置为DEBUG级别：<BR>rootLogger.setLevel(Level.DEBUG); </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>xml格式的log4j配置文件概述</B></TD></TR>
<TR class=main>
<TD>
<P>xml格式的log4j配置文件需要使用<TT>org.apache.log4j.html.DOMConfigurator.configure()</TT>方法来读入。对xml文件的语法定义可以在log4j的发布包中找到：<TT>org/apache/log4j/xml/log4j.dtd</TT>。</P>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>log4j的xml配置文件的树状结构</B></TD></TR>
<TR class=main>
<TD>
<P>log4j的xml配置文件的树状结构如下所示，注意下图只显示了常用的部分。 :.</P>
<P><TT><PRE>          xml declaration and dtd
            |
          log4j:configuration
            |
            +-- appender (name, class)
            |     |
            |     +-- param (name, value)
            |     +-- layout (class)
            |           |
            |           +-- param (name, value)
            +-- logger (name, additivity)
            |     |
            |     +-- level (class, value)
            |     |     |
            |     |     +-- param (name, value)
            |     +-- appender-ref (ref)
            +-- root
                  |
                  +-- param (name, class)
                  +-- level
                  |     |
                  |     +-- param (name, value)
                  +-- appender-ref (ref)  
        </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>xml declaration and dtd</B></TD></TR>
<TR class=main>
<TD>
<P>xml配置文件的头部包括两个部分：xml声明和dtd声明。头部的格式如下： :.</P>
<P><TT><PRE>          &lt;?xml version="1.0" encoding="UTF-8" ?&gt;
          &lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;
        </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>log4j:configuration (root element)</B></TD></TR>
<TR class=main>
<TD>
<P>
<OL>
<LI><TT><B>xmlns:log4j</B> [#FIXED attribute]</TT> : 定义log4j的名字空间，取定值<TT>"http://jakarta.apache.org/log4j/"</TT> 
<LI><TT><B>appender</B> [* child]</TT> : 一个appender子元素定义一个日志输出目的地 
<LI><TT><B>logger</B> [* child]</TT> : 一个logger子元素定义一个日志写出器 
<LI><TT><B>root</B> [? child]</TT> : root子元素定义了root logger </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>appender</B></TD></TR>
<TR class=main>
<TD>
<P>appender元素定义一个日志输出目的地。</P>
<P>
<OL>
<LI><TT><B>name</B> [#REQUIRED attribute]</TT> : 定义appender的名字，以便被后文引用 
<LI><TT><B>class</B> [#REQUIRED attribute]</TT> : 定义appender对象所属的类的全名 
<LI><TT><B>param</B> [* child]</TT> : 创建appender对象时传递给类构造方法的参数 
<LI><TT><B>layout</B> [? child]</TT> : 该appender使用的layout对象 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>layout</B></TD></TR>
<TR class=main>
<TD>
<P>layout元素定义与某一个appender相联系的日志格式化器。</P>
<P>
<OL>
<LI><TT><B>class</B> [#REQUIRED attribute]</TT> : 定义layout对象所属的类的全名 
<LI><TT><B>param</B> [* child]</TT> : 创建layout对象时传递给类构造方法的参数 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>logger</B></TD></TR>
<TR class=main>
<TD>
<P>logger元素定义一个日志输出器。</P>
<P>
<OL>
<LI><TT><B>name</B> [#REQUIRED attribute]</TT> : 定义logger的名字，以便被后文引用 
<LI><TT><B>additivity</B> [#ENUM attribute]</TT> : 取值为"true"（默认）或者"false"，是否继承父logger的属性 
<LI><TT><B>level</B> [? child]</TT> : 定义该logger的日志级别 
<LI><TT><B>appender-ref</B> [* child]</TT> : 定义该logger的输出目的地 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>root</B></TD></TR>
<TR class=main>
<TD>
<P>root元素定义根日志输出器root logger。</P>
<P>
<OL>
<LI><TT><B>param</B> [* child]</TT> : 创建root logger对象时传递给类构造方法的参数 
<LI><TT><B>level</B> [? child]</TT> : 定义root logger的日志级别 
<LI><TT><B>appender-ref</B> [* child]</TT> : 定义root logger的输出目的地 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>level</B></TD></TR>
<TR class=main>
<TD>
<P>level元素定义logger对象的日志级别。</P>
<P>
<OL>
<LI><TT><B>class</B> [#IMPLIED attribute]</TT> : 定义level对象所属的类，默认情况下是"org.apache.log4j.Level类 
<LI><TT><B>value</B> [#REQUIRED attribute]</TT> : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出 
<LI><TT><B>param</B> [* child]</TT> : 创建level对象时传递给类构造方法的参数 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>appender-ref</B></TD></TR>
<TR class=main>
<TD>
<P>appender-ref元素引用一个appender元素的名字，为logger对象增加一个appender。</P>
<P>
<OL>
<LI><TT><B>ref</B> [#REQUIRED attribute]</TT> : 一个appender元素的名字的引用 
<LI>appender-ref元素没有子元素 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>param</B></TD></TR>
<TR class=main>
<TD>
<P>param元素在创建对象时为类的构造方法提供参数。它可以成为<TT>appender</TT>、<TT>layout</TT>、<TT>filter</TT>、<TT>errorHandler</TT>、<TT>level</TT>、<TT>categoryFactory</TT>和<TT>root</TT>等元素的子元素。</P>
<P>
<OL>
<LI><TT><B>name</B> and <B>value</B> [#REQUIRED attributes]</TT> : 提供参数的一组名值对 
<LI>param元素没有子元素 </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>在xml文件中配置appender和layout</B></TD></TR>
<TR class=main>
<TD>
<P>创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。</P>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>创建ConsoleAppender对象</B></TD></TR>
<TR class=main>
<TD>
<P>ConsoleAppender的构造方法不接受其它的参数。 :.</P>
<P><TT><PRE>          ... ... ... ...
          &lt;appender name="console.log" class="org.apache.log4j.ConsoleAppender"&gt;
            &lt;layout ... &gt;
              ... ...
            &lt;/layout&gt;
          &lt;/appender&gt;
          ... ... ... ...
        </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>创建FileAppender对象</B></TD></TR>
<TR class=main>
<TD>
<P>可以为FileAppender类的构造方法传递两个参数：<TT>File</TT>表示日志文件名；<TT>Append</TT>表示如文件已存在，是否把日志追加到文件尾部，可能取值为"true"和"false"（默认）。 :.</P>
<P><TT><PRE>          ... ... ... ...
          &lt;appender name="file.log" class="org.apache.log4j.FileAppender"&gt;
            &lt;param name="File" value="/tmp/log.txt" /&gt;
            &lt;param name="Append" value="false" /&gt;
            &lt;layout ... &gt;
              ... ...
            &lt;/layout&gt;
          &lt;/appender&gt;
          ... ... ... ...
        </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>创建RollingFileAppender对象</B></TD></TR>
<TR class=main>
<TD>
<P>除了<TT>File</TT>和<TT>Append</TT>以外，还可以为RollingFileAppender类的构造方法传递两个参数：<TT>MaxBackupIndex</TT>备份日志文件的个数（默认是1个）；<TT>MaxFileSize</TT>表示日志文件允许的最大字节数（默认是10M）。 :.</P>
<P><TT><PRE>          ... ... ... ...
          &lt;appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender"&gt;
            &lt;param name="File" value="/tmp/rollingLog.txt" /&gt;
            &lt;param name="Append" value="false" /&gt;
            &lt;param name="MaxBackupIndex" value="2" /&gt;
            &lt;param name="MaxFileSize" value="1024" /&gt;
            &lt;layout ... &gt;
              ... ...
            &lt;/layout&gt;
          &lt;/appender&gt;
          ... ... ... ...
        </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=subsection-bg cellSpacing=1 align=center>
<TBODY>
<TR class=subsection>
<TD noWrap><B>创建PatternLayout对象</B></TD></TR>
<TR class=main>
<TD>
<P>可以为PatternLayout类的构造方法传递参数ConversionPattern。 :.</P>
<P><TT><PRE>          ... ... ... ...
          &lt;layout class="org.apache.log4j.PatternLayout&gt;
            &lt;param name="Conversion" value="%d [%t] %p - %m%n" /&gt;
          &lt;/layout&gt;
          ... ... ... ...
        </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><BR>
<TABLE class=section-bg cellSpacing=1 align=center>
<TBODY>
<TR class=section>
<TD noWrap><B>我自己的一个使用xml文件配置log4j环境的很简单的例子</B></TD></TR>
<TR class=main>
<TD>
<P>为WSOTA项目开发java web start的胖客户端时，使用了如下的xml文件配置log4j环境（文件名为wsota-rc.log4j.html）：:.</P>
<P><TT><PRE>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;

&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt;
  <FONT color=green>
  &lt;!-- ================================================================= --&gt;
  &lt;!--                     a rolling file appender                       --&gt;
  &lt;!-- ================================================================= --&gt;
  </FONT>
  &lt;appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender"&gt;
    &lt;param name="File" value="/tmp/wsota-rc.log" /&gt;
    &lt;param name="Append" value="false" /&gt;
    &lt;layout class="org.apache.log4j.PatternLayout"&gt;
      &lt;param name="ConversionPattern" value="%d [%t] %p - %m%n" /&gt;
    &lt;/layout&gt;
  &lt;/appender&gt;
  <FONT color=green>
  &lt;!-- ================================================================= --&gt;
  &lt;!--                       a console appender                          --&gt;
  &lt;!--     debug can be turned off by setting level of root to "off"     --&gt;
  &lt;!-- ================================================================= --&gt;
  </FONT>
  &lt;appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender"&gt;
    &lt;layout class="org.apache.log4j.PatternLayout"&gt;
      &lt;param name="ConversionPattern" value="%d [%t] %p - %m%n" /&gt;
    &lt;/layout&gt;
  &lt;/appender&gt;
  <FONT color=green>
  &lt;!--  use this to turn on debug to a rolling file. --&gt;
  </FONT>
  &lt;root&gt;
    &lt;level value="debug" /&gt;
    &lt;appender-ref ref="wsota-rc.file.log" /&gt;
  &lt;/root&gt;
  <FONT color=green>
  &lt;!--  use this to turn on debug to console. --&gt;
  &lt;!--
  &lt;root&gt;
    &lt;level value="off" /&gt;
    &lt;appender-ref ref="wsota-rc.console.log" /&gt;
  &lt;/root&gt;
  --&gt;
  </FONT>
  <FONT color=green>
  &lt;!--  use this to turn off debug. --&gt;
  &lt;!--
  &lt;root&gt;
    &lt;level value="off" /&gt;
    &lt;appender-ref ref="wsota-rc.console.log" /&gt;
  &lt;/root&gt;
  --&gt;
  </FONT>
&lt;/log4j:configuration&gt;
      </PRE></TT>
<P></P>
<P>在胖客户程序中使用了如下代码来使用外部xml文件配置log4j环境，注意该代码段位于程序的main class的静态初始化块中，含有以下代码的类和xml配置文件在同一个目录下：:.</P>
<P><TT><PRE>  import org.apache.log4j.html.DOMConfigurator;
  
  public class SapFrame extends JFrame {
      static {
          DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.html"));
      }
      ... ... ... ...
  }
      </PRE></TT>
<P></P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>Log4j的编码习惯</B></TD></TR>
<TR class=main>
<TD>
<P>
<OL>
<LI>让每个类都拥有一个private static的Logger对象，用来输出该类中的全部日志信息 
<LI>使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意：在一个项目中，log4j环境只需要被配置一次，而不是在每个使用了logger的类里都需要调用一次 
<LI>用<TT>MyClass.class</TT>作为参数创建该类的静态Logger对象 
<LI><FONT color=#ff0000>补充中...</FONT> </LI></OL>
<P></P></TD></TR></TBODY></TABLE><BR>
<TABLE class=chapter-bg cellSpacing=1 align=center>
<TBODY>
<TR class=chapter>
<TD noWrap><B>参考资料</B></TD></TR>
<TR class=main>
<TD>
<P>
<OL>
<LI>Log4j主页上的相关文档：<A href="http://jakarta.apache.org/log4j/docs">http://jakarta.apache.org/log4j/docs</A> 
<LI>Ashley J.S Mills的log4j教程：<A href="http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html">http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html</A> </LI></OL></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/haoqingshi/aggbug/21948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/haoqingshi/" target="_blank">Java&Inter</a> 2005-11-30 13:33 <a href="http://www.blogjava.net/haoqingshi/articles/21948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>