??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区成人,精品国产乱码,在线国产小视频http://www.aygfsteel.com/haoqingshi/articles/21948.htmlJava&InterJava&InterWed, 30 Nov 2005 05:33:00 GMThttp://www.aygfsteel.com/haoqingshi/articles/21948.htmlhttp://www.aygfsteel.com/haoqingshi/comments/21948.htmlhttp://www.aygfsteel.com/haoqingshi/articles/21948.html#Feedback0http://www.aygfsteel.com/haoqingshi/comments/commentRss/21948.htmlhttp://www.aygfsteel.com/haoqingshi/services/trackbacks/21948.html
Log4j 学习(fn)W记

by heavyz
2003-04-15


Log4j主页Q?A >http://jakarta.apache.org/log4j


Index

  1. Log4j的类?
  2. LoggerQ日志写出器
    1. Logger的输出方?
    2. Logger的命名规?
    3. Log level
    4. CZ代码
    5. 关于logger的两点说?
  3. AppenderQ日志目的地
    1. ConsoleAppender
    2. FileAppender
    3. RollingFileAppender
  4. LayoutQ日志格式化?
    1. PatternLayout
    2. patterns in PatternLayout
  5. ConfigurationQ配|?
    1. 默认的log4j初始化过E?
    2. BasicConfigurator.configure()
    3. xml格式的log4j配置文g概述
    4. 在xml文g中配|a(chn)ppender和layout
    5. 我自q一个用xml文g配置log4j环境的很单的例子
  6. Log4j的编码习(fn)?
  7. 参考资?


Log4j的类?/B>

  1. Logger - 日志写出器,供程序员输出日志信息
  2. Appender - 日志目的圎ͼ把格式化好的日志信息输出到指定的地方?
    1. ConsoleAppender - 目的Cؓ(f)控制台的Appender
    2. FileAppender - 目的Cؓ(f)文g的Appender
    3. RollingFileAppender - 目的Cؓ(f)大小受限的文件的Appender
  3. Layout - 日志格式化器Q用来把E序员的logging request格式化成字符?
    1. PatternLayout - 用指定的pattern格式化logging request的Layout


LoggerQ日志写出器

Logger对象是用来取?TT>System.out或?TT>System.err的日志写出器Q用来供E序员输出日志信息?/P>
Logger的输出方?/B>

Loggercd象提供一pdҎ(gu)供程序员输出日志信息?/P>

        

        ------ Log4j APIs : class Logger ------
        
        
        
        // Printing methods :
        
        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);
        
        // Generic printing method :
        
        public void log(Level l, Object msg);
      


Logger的命名规?/B>

Logger׃个Stringcȝ名字识别Qlogger的名字是大小写敏感的Q且名字之间hl承的关p,子名有父名作为前~Q用点号.分隔。如Q?TT>x.y?TT>x.y.z的父二Ӏ?/P>

根logger (root logger)是所有logger的祖先,它具有如下属性:(x)1) 它L存在的;2) 它不可以通过名字获得?/P>

通过调用public static Logger Logger.getRootLogger()获得root loggerQ通过调用public static Logger Logger.getLogger(String name)或?TT>public static Logger Logger.getLogger(Class clazz)获得Q或者创建)(j)一?TT>named logger。后者相当于调用Logger.getLogger(clazz.getName())?/P>

在某对象中,用该对象所属的cMؓ(f)参数Q调?TT>Logger.getLogger(Class clazz)以获得logger被认为是目前所知的最理智的命名logger的方法?/P>


Log level

每个logger都被分配?jin)一个日志?(log level)Q用来控制日志信息的输出。未被分配level的logger承它最q的父logger的level?/P>

每条输出到l(f)ogger的日志请?logging request)也都有一个levelQ如果该request的level大于{于该logger的levelQ则该request被处理Q称为enabledQ;否则该request被忽略。故可得知:(x)

  1. logger的level低Q表Clogger详l?
  2. logging request的level高Q表Clogging request优先输?

LevelcM预定义了(jin)五个levelQ它们的大小关系如下Q?/P>

        Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF
      


CZ代码

以下代码用自己所属的cMؓ(f)参数Q创Z个loggerQ启用默认配|,讄其levelq向其输?gu)qlogging request?/P>

import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;

public class Log4jTest {
    public static void main(String argv[]) {
    
        
        // Create a logger by the name of class Log4jTest.
        
        Logger logger = Logger.getLogger(Log4jTest.class);
        
        // Use the default configuration.
        
        BasicConfigurator.configure();
        
        // Set the logger level to Level.INFO
        
        logger.setLevel(Level.INFO);
        
        // This request will be disabled since Level.DEBUG < Level.INFO.
                  
        logger.debug("This is debug.");
        
        // These requests will be enabled.
                  
        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;
    }
}
      


关于logger的两点说?/B>

  1. 用同名参数调?TT>Logger.getLogger(String name)返回同一个logger的引用。故可以在一个地斚w|loggerQ在另外一个地方获得配|好的loggerQ而无ȝ互间传递logger的引用?
  2. logger的创建可以按照Q意的序Q即Q父logger可以后于子logger被创建。log4j自动维护logger的承树(wi)?



AppenderQ日志目的地

每个logger都可以拥有一个或者多个appenderQ每个appender表示一个日志的输出目的圎ͼ比如console或者某个文件。可以?TT>Logger.addAppender(Appender app)为logger增加一个appenderQ可以?TT>Logger.removeAppender(Appender app)为loggerU除一个appender?/P>

默认情况下,logger的additive标志被设|ؓ(f)trueQ表C子logger承父logger的所有appenders。该选项可以被重新设|,表示子logger不再承父logger的appenders?/P>

root logger拥有目标?TT>system.out?TT>consoleAppenderQ故默认情况下,所有的logger都将l承该appender?/P>

      

      ------ Log4j APIs : class Logger ------
      
      
      
      // 为logger对象增加或者移除一个Appender对象 :.
      
      public void appAppender(Appender app);
      public void removeAppender(Appender app);
      
      // 获得和设|a(chn)dditive标志Q是否承父logger的appenders :.
      // 注意Q?/B>在设|a(chn)dditive标志为falseӞ必须保证已经logger讄?jin)新的appenderQ?:.
      // 否则log4j报错:(x)log4j:WARN No appenders could be found for logger (x.y.z). :.
      
      public boolean getAdditivity();
      public void setAdditivity(boolean additive);
    

ConsoleAppender

可以使用ConsoleAppender对象把日志输出到控制台。每?TT>ConsoleAppender都有一?TT>targetQ表C它的输出目的地。它可以?TT>System.outQ标准输?gu)备(~冲昄屏)(j)Q或者是System.errQ标准错误设备(不缓冲显C屏Q?TT>ConsoleAppender的用方法参考如下API :.

        

        ------ Log4j APIs : class ConsoleAppender extends WriterAppender ------
        
      
        
        // 构造方法,使用一个Layout对象构造一个ConsoleAppender对象 :.
        // 默认情况下,ConsoleAppender的target是System.out :.
        
        public ConsoleAppender(Layout layout);
        
        // 构造方法,使用一个Layout对象和一个target字符串构造ConsoleAppender对象 :.
        // target的可能取gؓ(f)ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR :.
        
        public ConsoleAppender(Layout layout, String target);
      


FileAppender

可以使用FileAppender对象把日志输出到一个指定的日志文g中去。用方法可以参考如下的API :.

        

        ------ Log4j APIs : class FileAppender extends WriterAppender ------
        
      
        
        // 构造方法,使用一个Layout对象和日志文件名构造一个FileAppender对象 :.
        
        public FileAppender(Layout layout, String filename)
            throws IOException;
        public FileAppender(Layout layout, String filename, boolean append)
            throws IOException;
      


RollingFileAppender

可以使用FileAppender的子c?TT>RollingFileAppender对象Q把日志输出C个指定的日志文g中。不同的是该日志文g的大受到限Ӟ当日志内容超出最大的寸Ӟ该文件将向上滚动Q最老的日志被擦除)(j)。还可以在该cd象中指定为日志文件做多少个备份。具体用方法参考如下API :.

        

        ------ Log4j APIs : class RollingFileAppender extends FileAppender ------
        
      
        
        // 构造方法,使用一个Layout对象和日志文件名构造一个RollingFileAppender对象 :.
        
        public RollingFileAppender(Layout layout, String filename)
            throws IOException;
        public RollingFileAppender(Layout layout, String filename, boolean append)
            throws IOException;
        
        // 获得和设|日志备份文件的个数 :.
        
        public int getMaxBackupIndex();
        public void setMaxBackupIndex(int index);
        
        // 获得和设|滚动日志文件的最大尺?:.
        
        public long getMaximumFileSize();
        public void setMaximumFileSize(long size);
      



LayoutQ日志格式化?/B>

每个appender都和一个layout相联p;layout的Q务是格式化用L(fng)logging requestQappender的Q务是把layout格式化好的输出内定w往指定的目的地?/P>
PatternLayout

PatternLayout是Layout的一个子c,用来使用cMC语言?TT>printf函数中用的格式控制字符串来控制日志的输出格式。用方法参考如下API :.

        

        ------ Log4j APIs : class PatternLayout extends Layout ------
        
      
        
        // 无参数构造方法,使用DEFAULT_CONVERSION_PATTERN构造一个PatternLayout :.
        // 注意Q?/B>DEFAULT_CONVERSION_PATTERN?%m%n"Q只打印消息信息 :.
        
        public PatternLayout();
        
        // 构造方法,使用自定义的pattern构造一个PatternLayout :.
        
        public PatternLayout(String pattern);
        
        // 获得和设|PatternLayout对象的日志pattern :.
        
        public String getConversionPattern();
        public void setConversionPattern(String pattern);
      


patterns in PatternLayout

未完待箋



ConfigurationQ配|?/B>

对log4j环境的配|就是对root logger的配|,包括把root logger讄为哪个?level)Qؓ(f)它增加哪些appenderQ等{。这些可以通过讄pȝ属性的Ҏ(gu)来隐式地完成Q也可以在程序里调用XXXConfigurator.configure()Ҏ(gu)来显式地完成?/P>
默认的log4j初始化过E?/B>

Loggercȝ?rn)态初始化?static initialization block)中对log4j的环境做默认的初始化?B>注意Q?/B>如果E序员已l通过讄pȝ属性的Ҏ(gu)来配|了(jin)log4j环境Q则不需要再昑ּ地调?TT>XXXConfigurator.configure()Ҏ(gu)来配|log4j环境?jin)?/P>

Logger的静(rn)态初始化块在完成初始化过E时检查一pdlog4j定义的系l属性。它所做的事情如下Q?

  1. (g)查系l属?TT>log4j.defaultInitOverrideQ如果该属性被讄为falseQ则执行初始化;否则Q只要不是falseQ无论是什么|甚至没有|都是否则Q,跌初始化?
  2. 把系l属?TT>log4j.configuration的Dl变量resource。如果该pȝ变量没有被定义,则把resource赋gؓ(f)"log4j.properties"?B>注意Q?/B>在apache的log4j文档中徏议用定?TT>log4j.configurationpȝ属性的Ҏ(gu)来设|默认的初始化文件是一个好Ҏ(gu)?
  3. 试图把resource变量转化成ؓ(f)一?TT>URL对象url。如果一般的转化Ҏ(gu)行不通,p?TT>org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)Ҏ(gu)来完成{化?
  4. 如果url?.html"l尾Q则调用Ҏ(gu)DOMConfigurator.configure(url)来完成初始化Q否则,则调用方?TT>PropertyConfigurator.configure(url)来完成初始化。如?TT>url指定的资源不能被获得Q则跛_初始化过E?


BasicConfigurator.configure()

BasicConfigurator.configure()Ҏ(gu)使用最的方法配|log4j环境?B>注:(x)所谓配|log4j环境Q就是指配置root loggerQ因为所有其它的logger都是root logger的后代,所以它们(默认情况下)(j)都将l承root logger的性质?/P>

BasicConfigurator.configure()完成的Q务是Q?

  1. 用默认pattern创徏PatternLayout对象pQ?BR>PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n");
  2. 用p创徏ConsoleAppender对象aQ目标是system.outQ标准输?gu)备?x)
    ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
  3. 为root logger增加一个ConsoleAppender pQ?BR>rootLogger.addAppender(p);
  4. 把root logger的log level讄为DEBUGU别Q?BR>rootLogger.setLevel(Level.DEBUG);


xml格式的log4j配置文g概述

xml格式的log4j配置文g需要?TT>org.apache.log4j.html.DOMConfigurator.configure()Ҏ(gu)来读入。对xml文g的语法定义可以在log4j的发布包中找刎ͼ(x)org/apache/log4j/xml/log4j.dtd?/P>
log4j的xml配置文g的树(wi)状结?/B>

log4j的xml配置文g的树(wi)状结构如下所C,注意下图只显CZ(jin)常用的部分?:.

          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)  
        


xml declaration and dtd

xml配置文g的头部包括两个部分:(x)xml声明和dtd声明。头部的格式如下Q?:.

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
        


log4j:configuration (root element)

  1. xmlns:log4j [#FIXED attribute] : 定义log4j的名字空_(d)取定?TT>"http://jakarta.apache.org/log4j/"
  2. appender [* child] : 一个appender子元素定义一个日志输出目的地
  3. logger [* child] : 一个logger子元素定义一个日志写出器
  4. root [? child] : root子元素定义了(jin)root logger


appender

appender元素定义一个日志输出目的地?/P>

  1. name [#REQUIRED attribute] : 定义appender的名字,以便被后文引?
  2. class [#REQUIRED attribute] : 定义appender对象所属的cȝ全名
  3. param [* child] : 创徏appender对象时传递给cL造方法的参数
  4. layout [? child] : 该appender使用的layout对象


layout

layout元素定义与某一个appender相联pȝ日志格式化器?/P>

  1. class [#REQUIRED attribute] : 定义layout对象所属的cȝ全名
  2. param [* child] : 创徏layout对象时传递给cL造方法的参数


logger

logger元素定义一个日志输出器?/P>

  1. name [#REQUIRED attribute] : 定义logger的名字,以便被后文引?
  2. additivity [#ENUM attribute] : 取gؓ(f)"true"Q默认)(j)或?false"Q是否承父logger的属?
  3. level [? child] : 定义该logger的日志?
  4. appender-ref [* child] : 定义该logger的输出目的地


root

root元素定义Ҏ(gu)志输出器root logger?/P>

  1. param [* child] : 创徏root logger对象时传递给cL造方法的参数
  2. level [? child] : 定义root logger的日志?
  3. appender-ref [* child] : 定义root logger的输出目的地


level

level元素定义logger对象的日志别?/P>

  1. class [#IMPLIED attribute] : 定义level对象所属的c,默认情况下是"org.apache.log4j.Levelc?
  2. value [#REQUIRED attribute] : 为level对象赋倹{可能的取g到大依ơؓ(f)"all"?debug"?info"?warn"?error"?fatal"?off"。当gؓ(f)"off"时表C没有Q何日志信息被输出
  3. param [* child] : 创徏level对象时传递给cL造方法的参数


appender-ref

appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender?/P>

  1. ref [#REQUIRED attribute] : 一个appender元素的名字的引用
  2. appender-ref元素没有子元?


param

param元素在创建对象时为类的构造方法提供参数。它可以成ؓ(f)appender?TT>layout?TT>filter?TT>errorHandler?TT>level?TT>categoryFactory?TT>root{元素的子元素?/P>

  1. name and value [#REQUIRED attributes] : 提供参数的一l名值对
  2. param元素没有子元?



在xml文g中配|a(chn)ppender和layout

创徏不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以用param子元素来讑֮不同的参数倹{?/P>
创徏ConsoleAppender对象

ConsoleAppender的构造方法不接受其它的参数?:.

          ... ... ... ...
          <appender name="console.log" class="org.apache.log4j.ConsoleAppender">
            <layout ... >
              ... ...
            </layout>
          </appender>
          ... ... ... ...
        


创徏FileAppender对象

可以为FileAppendercȝ构造方法传递两个参敎ͼ(x)File表示日志文g名;Append表示如文件已存在Q是否把日志q加到文件尾部,可能取gؓ(f)"true"?false"Q默认)(j)?:.

          ... ... ... ...
          <appender name="file.log" class="org.apache.log4j.FileAppender">
            <param name="File" value="/tmp/log.txt" />
            <param name="Append" value="false" />
            <layout ... >
              ... ...
            </layout>
          </appender>
          ... ... ... ...
        


创徏RollingFileAppender对象

除了(jin)File?TT>Append以外Q还可以为RollingFileAppendercȝ构造方法传递两个参敎ͼ(x)MaxBackupIndex备䆾日志文g的个敎ͼ默认?个)(j)Q?TT>MaxFileSize表示日志文g允许的最大字节数Q默认是10MQ?:.

          ... ... ... ...
          <appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="/tmp/rollingLog.txt" />
            <param name="Append" value="false" />
            <param name="MaxBackupIndex" value="2" />
            <param name="MaxFileSize" value="1024" />
            <layout ... >
              ... ...
            </layout>
          </appender>
          ... ... ... ...
        


创徏PatternLayout对象

可以为PatternLayoutcȝ构造方法传递参数ConversionPattern?:.

          ... ... ... ...
          <layout class="org.apache.log4j.PatternLayout>
            <param name="Conversion" value="%d [%t] %p - %m%n" />
          </layout>
          ... ... ... ...
        



我自q一个用xml文g配置log4j环境的很单的例子

为WSOTA目开发java web start的胖客户端时Q用了(jin)如下的xml文g配置log4j环境Q文件名为wsota-rc.log4j.htmlQ:(x):.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  
  <!-- ================================================================= -->
  <!--                     a rolling file appender                       -->
  <!-- ================================================================= -->
  
  <appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="/tmp/wsota-rc.log" />
    <param name="Append" value="false" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n" />
    </layout>
  </appender>
  
  <!-- ================================================================= -->
  <!--                       a console appender                          -->
  <!--     debug can be turned off by setting level of root to "off"     -->
  <!-- ================================================================= -->
  
  <appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n" />
    </layout>
  </appender>
  
  <!--  use this to turn on debug to a rolling file. -->
  
  <root>
    <level value="debug" />
    <appender-ref ref="wsota-rc.file.log" />
  </root>
  
  <!--  use this to turn on debug to console. -->
  <!--
  <root>
    <level value="off" />
    <appender-ref ref="wsota-rc.console.log" />
  </root>
  -->
  
  
  <!--  use this to turn off debug. -->
  <!--
  <root>
    <level value="off" />
    <appender-ref ref="wsota-rc.console.log" />
  </root>
  -->
  
</log4j:configuration>
      

在胖客户E序中用了(jin)如下代码来用外部xml文g配置log4j环境Q注意该代码D位于程序的main class的静(rn)态初始化块中Q含有以下代码的cdxml配置文g在同一个目录下Q?.

  import org.apache.log4j.html.DOMConfigurator;
  
  public class SapFrame extends JFrame {
      static {
          DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.html"));
      }
      ... ... ... ...
  }
      



Log4j的编码习(fn)?/B>

  1. 让每个类都拥有一个private static的Logger对象Q用来输?gu)cM的全部日志信?
  2. 使用xml文g来完成对log4j环境的配|。在目的main class中的?rn)态初始化块里放log4j环境的配|代码。注意:(x)在一个项目中Qlog4j环境只需要被配置一ơ,而不是在每个使用?jin)logger的类里都需要调用一?
  3. ?TT>MyClass.class作ؓ(f)参数创徏该类的静(rn)态Logger对象
  4. 补充?..


参考资?/B>

  1. Log4j主页上的相关文档Q?A >http://jakarta.apache.org/log4j/docs
  2. Ashley J.S Mills的log4j教程Q?A >http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html


Java&Inter 2005-11-30 13:33 发表评论
]]>
վ֩ģ壺 | ͨμ| | | ɽ| | Դ| | ͷ| ޽| ɽ| | ʡ| | ͤ| | ¡| | ˱| | | | ɽ| żҸ| | ߮| | | | | | Ȩ| | ɽ| | ˫| | û| | ³| |