云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Log4j 简要剖析

Posted on 2007-06-23 09:11 云自无心水自闲 阅读(795) 评论(0)  编辑  收藏 所属分类: Java

Log4j

Log4j的核心是3大组件:Logger、Appender、Layout。

首先是Logger,Logger的意义在于它不象System.out,它可以根据需要屏蔽部分的Log输出,同时其他的Log输出不受影响。
一、Logger有层次结构。有了层次结构就意味着有了继承关系,也就意味着可以重用。这似乎和面向对象语言很想象。
Logger都是有名称的,而Logger的名称和Java一样,也是XXX.XXX.XXX,和Java一样的规则,相当简单。类似于Java中的Object,Logger的存在一个默认的根节点:root

Logger的名称一般这样获得:
Logger logger = Logger.getLogger("XXX.XXX.XXX");
或者
Logger logger = Logger.getLogger(this.getClass());
Log4j并没有强制要求用类名作为Logger的名称,但是这是推荐的做法。

二、有了层次结构后,就要说一下级别了,文章开始的时候就提到,Log4j的优势就在于能够根据需要过滤Log的输出,主要(不是全部)就是通过级别实现的。
Log4j把级别分为:Fatal,Error,Warn,Info,Debug。这样的区分也是经过慎重考虑的,如果引入太多的层次,会使得程序开发者在记录日志的时候,难以选择,会挑花了眼。
级别之间存在优先级的高低。
通过如下语句,输出不同级别的Log
logger.debug("...");
logger.info("...");
logger.warn("...");
logger.error("...");
logger.fatal("...");

如果Logger的级别设为Warn,那么只有级别比Warn高的语句的Log才会输出。 比如:logger.debug语句这时不起作用。

三、层次结构的继承关系现在便发挥作用了。子节点如果没有显式定义级别,那么自动继承最近的父节点的级别。这样,就不需要为每一个Logger都去定义级别了,因为至少根节点是存在的,可以从根节点中获得级别定义。

四、全局级别,可以通过设置日志的“门槛”,来实现全局强制性的级别控制。
LoggerResposity reposity = x.getLoggerResposity();
resposity.setThreshold(Level.WARN); 这完全可以在配置文件中配置。
这样,logger.info语句将不再起作用。

 

其次是Appender,Appender决定了Log究竟输出到什么地方,Log4j提供了多重输出的功能,也就是说可以为Log定义多个输出地点。
同样,层次结构在这里也发挥的威力,子节点的Logger将会继承父节点的Appender,免去了一个一个定义Appender的工作,根节点默认的Appender的Console。
当然,也可以设置不继承父节点的Appender


最后是Layout,Layout决定了Log的格式。

Log4j的配置完全可以通过编程实现,对于特别简单的应用来说,绝对是够用了。但是,对于稍微大一点的应用,把配置硬编码在程序中是不灵活的。所以,使用配置配置文件是比较好的选择。




只有注册用户登录后才能发表评论。


网站导航: