Log4J学习【十四】XML配置方式

来源:互联网 发布:用户数据分析方法 编辑:程序博客网 时间:2024/04/30 15:06
在Log4j中使用XML的配置方式,首先从根本上讲,和使用properties文件配置Log4j的方式和内容应该是大同小异的。所以,在学习XML配置方式的时候,我们应该采用对比+猜测的方式来完成。在学习一门技术的时候,特别对于细节的知识点,最好不要去死记硬背,多使用猜测和举一反三的方法,学习起来会更加轻松。
    首先,要使用XML的方式来配置Log4j,我们至少要准备一份XML配置文件,并且要使用这份XML配置文件来完成Log4j的配置。所以,我们先来看看在使用XML的情况下的启动代码:
@Test
public void testXmlConf() {
    DOMConfigurator.configure("log4j.xml");

    Logger log = Logger.getLogger("cd.itcast.log");
    log.debug("log debug..");
    log.info("log info..");
}

    整个代码只有第一句有点意思。从表面上看,他非常的类似PropertyConfigurator.configure方法,只是这里换成了DOMConfigurator。意思很明了,这里是准备使用XML来完成配置,所以我们得准备解析DOM了。
    接下来得着手开始写这个log4j.xml配置文件。第一个问题,这个文件应该放在什么地方?要解决这个问题,除了看文档,如果我们自己来解决应该怎么做?很简单,两个方法,1,直接运行这段代码,报错:
java.io.FileNotFoundException: E:\workspace\log4j\log4j.xml (系统找不到指定的文件。)
    通过这个结果,我们可以看到文件具体存放的位置。第二种方式,直接看代码:直接点开DOMConfigurator.configure方法:
  static public void configure(String filename) throws FactoryConfigurationError {
    new DOMConfigurator().doConfigure(filename, 
      LogManager.getLoggerRepository());
  }

    再进入doConfigure方法:
public void doConfigure(final String filename, LoggerRepository repository) {
    ParseAction action = new ParseAction() {
          public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
              return parser.parse(new File(filename));
          }
          public String toString() { 
              return "file [" + filename + "]"; 
          }
    };
    doConfigure(action, repository);
  }

    代码其实是很清晰的,一个标准的命令模式,使用DocumentBuilder完成Document的解析,然后接着解析配置。如果初学的程序员看不懂这段代码,也不要慌,我们要看的其实就是一句话,new File(filename);好了,已经很清楚了,其实就是直接使用传入的文件名创建一个File对象。那么这个文件理所当然应该放在项目路径下面。
    我们在项目路径下面创建一个log4j.xml文件,不写任何内容,直接运行测试:
log4j:WARN Fatal parsing error 2 and column 1
log4j:WARN Premature end of file.
log4j:ERROR Could not parse file [log4j.xml].

    说明文件已经找到,下面就要填写XML里面的内容了。一般来说,这些开源项目如果有XML配置的方式,都至少要提供DTD或者Schema文件,我们在log4j目录中搜索*.dtd,找到了log4j.dtd。那这个DTD就是我们配置的参考了。打开DTD文件,可以看到log4j的DTD文件并没有申明PUBLIC ID,那我们只能使用SYSTEM引用的方式来使用了(如果这段不太理解,可以看看传智播客的XML教学视频)。这里就简单将Log4j.dtd拷贝到log4j.xml同目录下,修改log4j.xml,引入DTD文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

    因为log4j.dtd中规定的xml的根元素名字是log4j:configuration,这里就只能这样写。接着,就准备完成配置了。这里第一个示例,我们来尝试一个简单的配置,直接配置rootLogger,然后能随意使用一种Appender来输出日志。结合之前的properties配置,我们知道,首先,得准备一个Appender,设置Appender中的Layout和相关属性,然后配置rootLogger,确定日志输出级别和添加的Appender,即可。所以,参照XML的提示,我们可以完成下面的XML配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
        <log4j:configuration>
            <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
            <param name="conversionPattern" value="%r [%t] %p %c %x - %m%n"/>
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="console"/>
    </root>
</log4j:configuration>

    这个XML配置文件已经足以演示使用XML的方式配置Log4j的大部分的细节了。首先,根元素为log4j:configruation,表明这是一个log4j的配置文件。接着我们使用了appender元素,这个元素很明显,在定义一个Appender,首先,定义一个Appender需要两个属性,一个是Appender的名字,一个是Appender的类型。所以,在配置中,我们为appender设置了对应的name和class属性,这是非常好理解的。接着,我们在Appender添加了一个子元素layout,因为在XML中元素之间有完成的包含结构,所以,在XML中配置Appender能很容易的把Layout直接包含进来,而不需要像properties文件那么麻烦。在layout元素上,必须要指定我使用的是什么类型的layout。这里,我们使用了PatternLayout。既然是patternLayout,就得为其设置对应的conversionPattern属性,所以,我们在layout子元素中,又增加了一个param元素,这个元素的属性非常简单,name+value,一个典型的key-value方式,所以,我们为name属性设置为conversionPattern,value属性设置为我们定义的pattern模式。自此,名字为console的appender就定义完成。整个流程和使用properties文件定义除了格式不相同,思路都是完全一致的。
    设置完成appender之后,我们就要定义rootLogger,设置其LEVEL和appender。所以,我们定义了root元素。在root元素中,有两个子元素,第一个是level,很明显,在定义root的日志输出级别,接着就是appender-ref元素,从名字上来看这个元素就是在定义rootLogger对应的appender,这个ref就是引用的意思,那后面的ref值就是之前定义的appender的名称,所以这里我们使用console。
    完成XML配置后,直接运行测试:
0 [main] DEBUG cd.itcast.log  - log debug..
0 [main] INFO cd.itcast.log  - log info..

    输出结果正常。
    从这个简单的例子,我们应该大概能看出XML配置的方式了,就是按照Log4j规定的格式配置对应的Appender,Layout,rootLogger和Logger即可。所以下面我们直接来看Log4j提供的各种元素和其意义,然后使用这些元素完成前面我们使用properties文件完成的功能。
<log4j:configuration>
    首先来看看根元素log4j:configuration上的属性:
1,threshold:和log4j.properties定义的log4j.threshold一样,规定了整个Logger体系的日志门槛。
2,debug:和log4j.properties定义的log4j.debug一样,打开Log4j内部的日志。
    在log4j:configuration元素之下可以定义的重要子元素有:
1,appender:定义能够被使用的Appender类型。
2,logger:定义自己的Logger。
3,root:定义rootLogger。

<appender>:
    首先来看看appender上的属性:
1,name:定义这个Appender的名字,供后面的Logger等引用。
2,class:定义Appender的类型。
在appender元素之下可以定义的重要子元素有:
1,params:和layout中的params元素一样,可以使用param元素中的name和value属性为Appender设置属性值。
2,layout:定义Appender绑定的Layout对象。

<layout>:
因为layout是每个appender独有的,不需要共享,所以layout没有name属性,只有class属性用于指定layout的类型。
另外在layout中,也提供了params元素,允许为layout对象设置属性值。

<root>:
root元素之下可以定义的重要子元素有:
1,level:定义rootLogger的日志输出级别
2,appender-ref:定义和该rootLogger绑定的appender。允许有多个。

<logger>:
logger元素可以设置的属性:
1,name:不用多说,即这个Logger的名称;
2,additivity:也很明显,设置该Logger的appender追加性。
logger元素之下可以定义的重要子元素有:
1,level:定义Logger的日志输出级别
2,appender-ref:定义和该Logger绑定的appender。允许有多个(这里请注意一下,官方文档介绍如果单独使用Logger元素额外定义log,其appender会全部删除,然后只添加appender-ref指定的Appender。其实并不是这样的,在Log4j-1.2这个版本代码中,仍然使用的是addAppender来添加的,所以appender仍然保持继承性)。
其他还有一些重要的属性,比如log4j:configuration下面的renderer元素,appender下面的errorHandler元素,appender下面的filter元素等,因为没有讲到对应的内容,所以留到具体讲解内容的时候再综合讲解其配置方式。
0 0
原创粉丝点击