Log4J学习【十】Properties配置方式

来源:互联网 发布:网络剧输出到电视台 编辑:程序博客网 时间:2024/05/21 08:44
首先来看一下使用properties来配置Log4j。首先我们知道,properties文件都是使用key-value的方式来配置的,我们要使用properties来配置Log4j,就是要使用一个一个的key-value来完成之前我们看到的类似rootLogger的level,rootLogger的appender,rootLogger的Layout,特定的logger的level;appender;layout等配置。这里就需要大家在看示例代码的时候,多展开一些想象,想象一下,这些配置文件最终转化出来的配置代码是怎样的。
    对于业务代码,我们还是使用之前的Configure对象和LogicProcessor对象,这个不需要修改,先来看看我们的测试代码:
@Test
public void testPropertyConfig() {
    PropertyConfigurator.configure(this.getClass().getClassLoader()
.getResourceAsStream("log4j.properties"));

    Configure conf=new Configure();
    conf.config();

    LogicProcessor processor=new LogicProcessor();
    processor.init(conf);
    processor.process();
}

    注意代码中的加粗的代码;这里,我们没有再使用BasicConfigurator.configure()方法来做最基本的配置,也没有单独的使用Logger.getRootLogger()或Logger.getLogger(String)来得到具体的某一个Logger实例再使用对应的setLevel();addAppender()等方法来配置,而是使用了一个PropertyConfigurator来通过读入在classpath下面的一个名字叫log4j.properties的配置文件的方式来完成配置。现在来运行一下测试代码,log4j会报一个错,提示并没有找到log4j.properties配置文件,下面,我们在应用classpath下建立一个log4j.properties的文件,内容如下:
log4j.rootLogger=INFO,A
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

    只要学习了之前的那些示例代码,来看这个配置文件,应该不会存在太大的问题。注意,在这里大家先不用太在意具体的配置key的格式,我们只来思考重要的内容:
    第一条代码,很明显,我们在配置rootLogger,我们配置了什么呢?注意value,value由两个部分组成,一个是INFO,另一个是A。这个INFO很明显,我们能猜到,是在规定rootLogger的Level为Level.INFO,相当于Logger.getRootLogger().setLevel(Level.INFO);我相信这点大家都能想到,但是后面那个A是什么意思呢?继续向下看。
    第二条代码,注意,在这里的key的值:log4j.appender.A,这下应该很明显了,首先,我们这条配置在配置一个appender,并且出现了一个A,这个A什么意思呢?其实和第一条配置联想,能够猜出,我们为一个appender起了一个名字:A,这条代码就在配置这个名字叫A的appender。再看看value,是一个ConsoleAppender的类型的全限定名,好了,想象力丰富一点的童鞋应该就能猜到了,我在这里定义了一个名字为A,类型为ConsoleAppender的appender,并把这个A赋给了rootLogger,相当于调用了代码:
Appender a=new ConsoleAppender();
Logger.getRootLogger().addAppender(a);

    第三条代码,注意这个key,在上一条配置的基础上,又增加了一个.layout,并且value指向了一个PatternLayout的类型。并把这个layout设置到了名字叫A的appender上。结合上面一条配置,相当于调用了代码:
Appender a=new ConsoleAppender();
Logger.getRootLogger().addAppender(a);
Layout l=new PatternLayout();
a.setLayout(l);

    虽然在这里我们其实并没有为layout起名字。
    第四条代码,在上一条配置的基础上,又增加了一个.conversionPattern。联想上一条配置,这个配置的意义应该非常明显了,我们在配置A这个Appender的PatternLayout的一个名字叫conversionPattern的属性。注意,在这里,我第一次使用了属性这个概念。没错,包括上面的layout和这里的conversionPattern都代表的是属性。我们知道,属性是一组符合特定命名规范的setter/getter;我们再来看看这两条配置,第一个layout,我们找到Appender类,这是一个接口:
public interface Appender {
  /**
     Set the {@link Layout} for this appender.

     @since 0.8.1
  */
  public void setLayout(Layout layout);

    是的,在这个接口中正有一个方法叫做setLayout,那么这个setter其实就规定了一个叫做layout的属性,而上面那条log4j.appender.A.layout=XX,就是规定了调用setLayout方法来传入一个类型为XX的Layout对象。当然,这一切都是使用反射和JavaBean内省机制完成的。同理,第二个conversionPattern,我们找到PatternLayout对象:
   /**
     Set the <b>ConversionPattern</b> option. This is the string which
     controls formatting and consists of a mix of literal content and
     conversion specifiers.
   */
  public
  void setConversionPattern(String conversionPattern) {
    pattern = conversionPattern;
    head = createPatternParser(conversionPattern).parse();
  }

    在PatternLayout中也有一个setConversionPattern(String)方法,那么当我们设置log4j.appender.A.layout.conversionPattern=xxx,其实就是调用了这个set方法;而其后的value就是传入set方法的参数String。那么这个conversionPattern指代的是什么呢?其实就是之前我们在简单介绍PatternLayout的时候,看到的那个用来格式化日志的模板字符串。
    好了,介绍到这里,大家都能看出来了,在这个配置文件中,就是使用了不同的key的格式,来完成了对rootLogger的level,appender和layout的配置。
0 0