log4j 学习

Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句。使用log4j可以很好的处理类似情况。

log4j使用方法
1.定义配置文件

   Log4j的初始化,通常使用配置文件灵活配置log日志的输出方式(输出优先级、输出目的地、输出格式)。Log4j支持两种配置文件格式,一种是XML 格式的文件log4j.xml,一种是Java特性文件log4j.properties(键=值)。
   需把log4j.jar和Log4j.properties(或者log4j.xml)放入 classpath,log4j默认会在classpath中寻找log4j的配置文件。
可指定配置文件位置如:
  set JAVA_OPTS=%JAVA_OPTS% -Dlog4j.configuration=

或在程序中指定  
  log4j.xml  --PropertyConfigurator.configure((DOMConfigurator.configure()).
  Log4j.properties --PropertyConfigurator.configure("String path");


2.组成部分

   Log4j中有三个主要的组件,它们分别是Logger、Appender和Layout.

   (1)logger指定log的名字,打印级别和采用哪种或者哪几种Appender。

   (2)Appender用来指明log信息打印到什么地方(如控制台,文件等).

   (3)Layout的作用是控制Log信息的输出格式.
  
    2.1 配置Logger层级
    log4j.rootLogger = [ level ] , appenderName, appenderName, …


    Logger的名称是区分大小写的,依据名称可以确定其层次结构(即父子关系),规则如下:
    (1)如果Logger A的名称后跟一个点(.)是Logger B的名称的前缀就认为Logger A是Logger B的祖先。
    (2)如果在Logger A和Logger B之间,Logger B没有任何其它的祖先就认为Logger A是Logger B的父亲。
   
    在Logger的层次结构的最顶层是rootLogger,它会永远存在,而且不能通过名字取到。 即所有的logger都是继承于rootLogger,如果某个logger没有被分配level,那么它将从一个被分配了级别的最接近它的父logger那里继承level。因此在定义日志的时候通常会给rootLogger赋予一个level.


    2.2 配置LoggerAppender

    appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

    2.3 配置level

    level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。
    Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。

    Logger选择日志记录请求(log request)的规则:   

    假设Logger M具有q级的Level,这个Level可能是设置的也可能是继承到的。   
    如果向Logger M发出一个Level为p的日志记录请求,那么只有满足p>=q时这个日志记录请求才会被处理。
    比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。

    另一种说法:
    当某个logger的logging request(即printing method(error(),info()..))的级别高于或者等于该logger的级别(即在log4j.properties或者 log4j.xml中定义)的时候,该logging request就为enable. 一旦该logger的logging request为enable,那么该logging request将总会打印到该logger所有的appender中包括它的所有父logger的appender。(而不会管父logger的级别如何)。除非该logger的父logger的additivity设置为false,默认的情况下为true。

    某个logger的additivity设置为false,表示log只打印到本log的appender中,而不再打印到其父logger的appender。



例如:
    Loger x.y是Logger x.y.z的祖先,因为x.y.是x.y.z的前缀,这符合规则的前一条。另外在Logger x.y和Logger x.y.z之间,Logger x.y.z没有其它的祖先,因此Logger x.y是Logger x.y.z的父亲,这符合规则的后一条。
    我们还可以看到每一个Logger都有一个Level,根据该Level的值Logger决定是否处理对应的日志请求。
    如果Logger C没有被设置Level,那么它将沿着它的层次结构向上查找,如果找到就继承并结束,否则会一直查找到root logger结束。因为log4j在设计时保证root logger会被设置一个默认的Level,所以任何logger都可以继承到Level。





补充:Log4J的使用步骤:
1. 得到记录器:
Java代码 
public staitc Logger getLogger(String name);  
public static Logger getLogger(Class clazz);   


2. 读取配置文件:
 
Java代码 
BasicConfigurator.configure();//快速使用Log4J缺省的环境  
PropertyConfigurator.configure(String configFileName);//读取Java属性文件编写的配置文件  
DOMConfigurator.configure(String fileName);//读取XML格式的配置文件  


3. 插入记录信息(格式化日志信息):
 
Java代码
 
  Logger.debug(Object message);  
  Logger.info(Object message);  
  Logger.warn(Object message);  
  Logger.error(Object message);

猜你喜欢

转载自chenk008.iteye.com/blog/1313627