Log4J学习【十三】Properties文件中能够定义的配置项的格式和示例二

来源:互联网 发布:用户数据分析方法 编辑:程序博客网 时间:2024/04/30 09:22
3,配置Logger:
    当配置完成Appender和其对应的Layout之后,就需要把Appender绑定在Logger之上了。Logger的配置主要分两类,一类是对RootLogger的配置,一类是对自定义Logger的配置。先来看看rootLogger的配置格式:
log4j.rootLogger=[LEVEL],[Appender1,Append2...AppendN]
    意思应该很明了,Level定义了rootLogger的日志输出级别,然后使用一个逗号分隔,逗号之后就是绑定在rootLogger之上的Appender,使用定义的Appender的名字即可。下面来看个简单的示例,就很明了了:
log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

    直接来看配置文件,在这个配置文件中,我们定义了一个appender名字叫console。并且配置其类型为ConsoleAppender,和其layout为一个SimpleLayout。然后,我们直接使用log4j.rootLogger=INFO,console完成了对rootLogger的配置。这里,我们定义日志的输出级别为INFO,并使用定义的consoleAppender来配置rootLogger。这段配置代码相当于:
Logger.getRootLogger().setLevel(Level.INFO);
Logger.getRootLogger().addAppender(new ConsoleAppender(new SimpleLayout()));

    来看看测试代码:
@Test
public void testLoggerConfig() {
    PropertyConfigurator.configure(this.getClass().getClassLoader()
.getResourceAsStream("log4j.properties"));
    Logger log=Logger.getLogger("cd.itcast.log");
    log.debug("log debug..");
    log.info("log info..");
}

    按照我们的配置和测试代码,应该使用SimpleLayout规定的格式输出log info..。来看看结果:
INFO - log info..
    符合我们的预期,而且通过这个例子也能看出,定义Appender的顺序和定义Logger的顺序并没有关系的。
下面再来看看多个Appender的情况:
log4j.rootLogger=INFO,console,file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
log4j.appender.file.file=log1.log

    在这段配置代码中,我们分别定义了两个Appender,一个是console,一个是file。然后,我们使用log4j.rootLogger=INFO,console,file将两个appender都添加到rootLogger上。按照我们的预期,当运行同样的测试代码之后,在控制台上会出现使用simpleLayout打印的log info...,并且在log1.log文件中添加使用pattern格式化的log info...
    运行测试:
INFO - log info..//控制台
0 [main] INFO cd.itcast.log  - log info..//log1.log文件
    符合我们的预期。可以看到,要配置rootLogger还是非常简单和清晰的。
    另外一种情况,配置自定义的Logger,格式为:
log4j.logger.loggerName=[LEVEL|INHERITED|NULL],[Appender1,Append2...AppendN]
    这里的LEVEL和Appender和rootLogger是相似的,只是在这里设置LEVEL的时候,多了两个选项:INHERITED和NULL。这两个选项的意义应该是非常明显的,这个LEVEL符合下面的规则:1,如果没有为一个Logger设置Level,就相当于使用NULL,即从当前体系结构中继承LEVEL;2,如果设置logger为INHERITED,就相当于明确告诉Logger从当前体系结构中继承LEVEL。呵呵,其实大家也能看出来,INHERITED和NULL效果是一样的。另外,如果设置的是NULL或者INHERITED,必须要大写。这点上,log4j是大小写敏感的。
    下面来看一个配置logger的示例:
log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

log4j.logger.cd.itcast=DEBUG,file

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
log4j.appender.file.file=log1.log

    注意我们加粗的配置。我们配置了rootLogger级别为LEVEL,并添加了一个console appender,然后我们定义了一个名字叫cd.itcast的Logger,并设置级别为DEBUG,然后添加了一个file Appender,相当于代码:
Logger log=Logger.getLogger(“cd.itcast”);
log.setLevel(Level.DEBUG);
log.addAppender(fileAppender);

    那么,当我们执行相同的测试后,按照我们的预期,cd.itcast.log继承cd.itcast,而cd.itcast设置了日志级别为Level.DEBUG,那么log debug..和log info..都应该被输出到控制台和log1.log文件中。运行测试:
DEBUG - log debug..//控制台
INFO - log info..//控制台
0 [main] DEBUG cd.itcast.log  - log debug..//log1.log
0 [main] INFO cd.itcast.log  - log info..//log1.log
    符合预期。另外,之前在我们介绍Logger体系结构中,我们介绍了一个Appender的课添加性,即logger.setAdditivity方法。同样,这个功能也能在配置文件中实现,设置additivity的格式为:
log4j.additivity.loggerName=true|false
    相当于调用loggerName.setAdditivity(true|false),配置后additivity遵循的appender继承规律和使用代码的方式一致。
另外,Log4J为了能更加灵活的配置,提供了一种类似定义变量的配置方式。我们先来看个示例:
log4j.rootLogger=INFO,file
dir=${user.home}
file=log1.log
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
log4j.appender.file.file=${dir}/${file}

    在这个例子中,展示了Log4j提供的两种变量使用方式。观察加粗的三条配置。第一条配置,dir=${user.home},很明显,${user.home}指代了当前用户的主目录,在windows中即为document and settings/user,并且把这个路径起了个名字dir;接着第二行,指定了一个变量file,内容为log1.log。在设置log4j.appender.file.file的时候,直接使用${dir}/${file}来引用了之前定义的两个变量,那么,Log4j会在解析这个file值之前,使用变量的值去替换变量的名称,即file值变成了document and setting/user/log1.log。
    运行这个示例,在C:\Documents and Settings\user\log.log文件中就会看到:
0 [main] DEBUG cd.itcast.log  - log debug..
0 [main] INFO cd.itcast.log  - log info..
    简单说一下Log4J对变量的值的查询顺序,首先,会在系统环境变量中按照变量的名字查询值,如果没有,在在配置文件中查询变量的值,最后,使用查询到的值替换占位符即可。这只是一个很小的功能点,了解即可。

    至此,使用property文件配置Log4j的一些重要的配置就到这里。使用properties方式配置Log4j在编写配置上是非常简单和方便的,而且Log4j在解析Properties文件的速度也是很快的。但是,由于properties文件本身的一些缺陷,导致一些Log4j中的高级特性无法使用properties文件配置完成,所以,Log4j还提供了使用XML的配置方式。在XML中,可以充分发挥XML在格式上的优势,配置很多Log4j中的很多高级特性。
0 0