ZooKeeper学习之配置【6】日志配置

ZooKeeper使用SLF4J(the Simple Logging Facade for Java)作为日志的抽象层,默认使用Log4J来做实际的日志工作。使用2层日志抽象看起来真是够呛,这里简要的说明如何来配置Log4J。尽管Log4J非常灵活且强大,但它也有一些复杂,可以用一整本书来描述它,这里只是简要的介绍一下基本的用法。

 

Log4J的配置文件名为log4j.properties,从classpath中查找。如果没有找到log4j.properties文件,会输出如下警告信息:

 

log4j:WARN No appenders could be found for logger (org.apache.zookeeper.serv ...
log4j:WARN Please initialize the log4j system properly.

 

它说的是所有后续的日志消息会被丢弃,通常log4j.properties文件会放在conf文件夹,并放在classpath下。

来看看ZooKeeper使用的log4j.properties的主要部分:

 

    zookeeper.root.logger=INFO, CONSOLE  (1)
    zookeeper.console.threshold=INFO
    zookeeper.log.dir=.
    zookeeper.log.file=zookeeper.log
    zookeeper.log.threshold=DEBUG
    zookeeper.tracelog.dir=.
    zookeeper.tracelog.file=zookeeper_trace.log
    log4j.rootLogger=${zookeeper.root.logger} (2)
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender (3)
    log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold} (4)
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout (5)
    log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -
    ...
    log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender (6)
    log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold} (7)
    log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
    log4j.appender.ROLLINGFILE.MaxFileSize=10MB
    log4j.appender.ROLLINGFILE.MaxBackupIndex=10
    log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout				
    log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -
    ...	

(1) 第一组设置以zookeeper开头,它们实际上是Java system property,可以被-D形式的命令行参数覆盖。第一行配置了日志级别,默认的设置是说在INFO级别以下的日志会被丢弃,并且日志会使用CONSOLE appender输出。你可以指定多个appender,例如如果你想使用CONSOLE appender和ROLLINGFILE appender输出日志,那么可以配置zookeeper.logger为INFO,CONSOLE,ROLLINGFILE。

 

(2) rootLogger处理所有日志的logger,因为我们没有定义其他logger。

 

(3) 这一行把CONSOLE appender和实际上处理日志输出的类绑定在一起,这里是ConsoleAppender类。

 

(4) appender也可以过滤日志。这一行将过滤任何在INFO级别之下的日志,因为这是在zookeeper.root.logger设置的threshold。

 

(5) appender使用一个布局(layout)类在输出前对日志进行格式化。我们使用pattern layout来记录日志的级别,日期,线程信息和调用位置信息以及消息本身。

 

(6) RollingFileAppender实现了rolling日志文件的功能,而不是持续的写到一个单独的文件或者控制台。如果rootLogger没有关联ROLLINGFILE,则此appender会被忽略。

 

(7) ROLLINGFILE的threshold设置成DEBUG。因为rootLogger过滤了所有在INFO级别之下的日志,没有DEBUG日志会输出到ROLLINGFILE。如果你想要看到DEBUG日志,你必须把zookeeper.root.logger从INFO改成DEBUG。

 

打日志会影响到进程的性能,尤其是在DEBUG级别下。同时日志会提供有价值的信息为诊断错误提供线索。一个平衡性能开销的有效方式是把appender的threshold设成DEBUG,并把rootLogger设成WARN级别,这在一般的情况都适用,一般只需要关注WARNING和它之上的日志。当你需要诊断问题时可以使用JMX动态设置为INFO或DEBUG级别,这样可以更方便定位问题。

猜你喜欢

转载自damacheng009.iteye.com/blog/2086476