Log4j的名气和作用我就不提了,这方面的介绍比比皆是,我这里主要是就我个人的理解谈谈log4j的核心框架,不涉及具体的使用,主要目的希望能够协助大家加强对log4j的认识。由于个人水平有限,理解不当之处,望各位批评指正,不胜惶恐。
一、 三类组件:Loggers、Appenders、Layouts
正是由这三类组件基本组件组成了log4j的基本框架。其中Logger提供了日志管理的具体功能(主要是输出);Appender提供了日志管理的输出目的地,即日志是输出到文件、还是输出到控制台、或者两者都输出、或者输出到其他地方;
Layout提供了日志输出的具体格式和附加信息,简单理解的话可以说就是输出的格式如何排版的问题(类似word文档)。
二、 Loggers之间的关系。
每一个Logger(root Logger例外)都是由唯一的名称标识的,只能Logger.getLogger(用Logger的名称做参数)(class static method)生成实例,相互之间通过名称确定关系。与Java类库的继承体系类似,所有Logger都有相同的根节点,即root Logger,他只能通过Logger.getRootLogger(class static method)访问,而且他永远存在。
Loggers之间的关系如下图(当作类的继承体系看比较合适):
[好像不能粘贴图片,若那位有兴趣的话找liudongbaollz◎21cn.com(msn)联系获取word格式的文档]
Root logger 是所有logger的祖先,如果一个logger的名称(如“com”)是另一个logger名称(“com.sun.java”)的前缀(以“.”作为分隔符),则“com”是“com.sun.java”的祖先,“com.sun.java”是com的子孙,可以理解为“com.sun.java”继承(间接继承)于“com”,一切正如大家所熟悉的java类库的继承体系。如果一个logger于另一个拥有祖孙关系的logger之间没有其他logger的话,如“com”和“com.ibm”,则又拥有父子关系。
三、 Logger的等级(level)属性与继承体系的关系。
Loggers 可以被赋予等级(level).等级集合包括:DEBUG, INFO, WARN, ERROR 和 FATAL,都定义在org.apache.log4j.Level类中。如果一个logger没有赋予任何等级(level),他将从最近的祖先logger获得相同的等级(level)。更正式的说,Logger(C)所能继承的等级等于,自C起沿着整个继承体系由下往上直到root logger找到的第一个不为空的等级(level)。
为了确保所有的logger都拥有等级, root logger总是会赋予一个等级(level).
四、 Appenders与继承体系的关系。
Logger通过方法addAppender为自己附加一个appdender。任何一个logger的已启用的logging请求都会将请求转发给继承体系种更高层次的logger中的所有appenders。换句话说,appenders在整个继承体系中也有额外的继承特性。比如:如果一个console appender 被附加给root logger ,那么所有启用的logging请求至少会在cosole中输出。
如果一个额外的file Appender被附加给logger(C), 那么所有来自C和C的子类的logging请求都会输出到file和console。通过设定 additivity flag为false.(setAdditivity)可以关闭这个特性以便减少appender的堆积。
控制此项特性(appender additivity)的规则描述如下:
Logger C 的 log 表达式输出将传递到C和他的ancestors(祖先)的所有appenders,这就是“appender additivity”的含义。然而,如果C的一个ancestors(祖先),称为P,已经将additivity 标志位设定为false,则C的log表达式输出将传递到C和向上所有的祖先直到P(包括P) 中的所有的appenders,但是不包括P的任何祖先的appenders。
五、 Logger中的Logging请求与等级(level)的关系。
Logging请求通过调用Logger中的输出方法来完成,主要输出方法有debug, info, warn, error, fatal 和 log。每个Logging请求也拥有相应的等级,其中调用log产生的Logging请求等级在参数中定义,由其他方法产生的Logging请求的等级由方法名字决定,如debug拥有DEBUG等级。
一个logging请求在其等级高于或等于他的logger等级时被视为启用的,否则被视为禁止的。即一个等级为q(无论该等级是自己设定还是通过继承获得的,都一视同仁)的logger中的一个等级为p的logging请求只有在p大于等于q的时候才会启用。这条规则是log4j的核心部分。他假定这些等级是有序的,对于标准等级,DEBUG < INFO < WARN < ERROR < FATAL。
本文地址:http://com.8s8s.com/it/it12524.htm