实践Log4j按级别分类输出
^^^^^^^^^^^^^^^^^^^^^^^
 - 作者:臭豆腐[trydofor.com]
 - 日期:2005-02-24
 - 授权:署名-非商业-保持一致 1.0 协议
 - 声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。

0. 文档目录
^^^^^^^^^^
[[<=$INDEX]]

1. 实现目标
^^^^^^^^^^^
不同的log级别,输出给不同的appender
比如,DEBUG显示在控制台,其他输出到FILE

2. 实现机理
^^^^^^^^^^^
这里使用xml格式的配置文件,重点就是在appender 节点中加入 filter 。

======================== dtd : log4j.dtd ======================
<!ELEMENT appender
    (errorHandler?,param*,layout?,filter*,appender-ref*)
>
... ...
<!ELEMENT filter (param*)>
<!ATTLIST filter class      CDATA   #REQUIRED >
... ...
<!ELEMENT param EMPTY>
<!ATTLIST param
  name      CDATA   #REQUIRED
  value     CDATA   #REQUIRED
>
===============================================================

======================== txt : log4j api ======================
org.apache.log4j.spi
Class Filter
java.lang.Object
  +--org.apache.log4j.spi.Filter
All Implemented Interfaces:
  OptionHandler
Direct Known Subclasses:
  DenyAllFilter, LevelMatchFilter, LevelRangeFilter, StringMatchFilter

LevelMatchFilter
    void setAcceptOnMatch(boolean acceptOnMatch)
    void setLevelToMatch(String level)
LevelRangeFilter
    void setAcceptOnMatch(boolean acceptOnMatch)
    void setLevelMax(Level levelMax)
    void setLevelMin(Level levelMin)
===============================================================

3) log4j 的xml配置文件中对filter的设置,应分别如下格式:
======================== xml : log4j config ======================
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="levelToMatch" value="ERROR"/>
        <param name="acceptOnMatch" value="true"/>
    </filter>

    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="levelMin" value="ERROR"/>
        <param name="levelMax" value="FATAL"/>
        <param name="acceptOnMatch" value="true"/>
    </filter>
===============================================================

3. 功能测试
^^^^^^^^^^^
============= java: com.trydofor.log4j.test.MultiOutput.java =============
package com.trydofor.log4j.test;

import java.net.URL;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class MultiOutput
{
    static Logger logger = Logger.getLogger(MultiOutput.class);

    public static void main(String[] args)
    {
        URL url = MultiOutput.class.getResource("log4j.xml");
        DOMConfigurator.configure(url);
        logger.error("error");
        logger.fatal("fatal");
        logger.warn("warn");
        logger.info("info");
    }
}
===============================================================

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

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-6p [%t - %F:%L - %c{1}] %m%n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
       <param name="levelMin" value="ERROR" />
       <!--param name="levelMax" value="FATAL" /-->
       <param name="AcceptOnMatch" value="true" />
    </filter>
  </appender>

  <appender name="file" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="log/cafis.log" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-6p [%t - %F:%L - %c{1}] %m%n"/>
    </layout>
  </appender>
  <root>
    <level value="WARN"/>
    <appender-ref ref="console"/>
    <appender-ref ref="file"/>
  </root>
</log4j:configuration>
===============================================================

输出结果
............................................................
CONCOLE:
2005-02-24 19:49:29,500 ERROR  ... ... error
2005-02-24 19:49:29,515 FATAL  ... ... fatal

FILE:
2005-02-24 19:49:29,500 ERROR  ... ... error
2005-02-24 19:49:29,515 FATAL  ... ... fatal
2005-02-24 19:49:29,515 WARN   ... ... warn
........................................................

4. 参考资料
^^^^^^^^^^^
  * [[log4j version #.#.# API Specification=>http://logging.apache.org/log4j/docs/api/index.html]]
  * jakarta-log4j-1.2.8/src/java/org/apache/log4j/xml/log4j.dtd
  * jakarta-log4j-1.2.8/src/java/org/apache/log4j/xml/examples/*.xml