log4j源码解析及一个log4j:ERROR Attempted to append to closed appender named 的问题

一、log4j源码解析

最近出现一个问题,弄得我不得不把log4j的源代码读了一篇。
先讲下log4j的设计.
log4j主要有元素:logger level appender layout filter,大致的组织关系如下:

与其他类结合一起,基本如下所示:

类图的左边基本是构建部分,其中比较关键的一个类是:Hierarchy,他组织了一个logger的父子关系。
代码中:
Category的方法; void  callAppenders(LoggingEvent event),在找appender的时候,是向父Category遍历,直到找到一个含有appender的父Category。

Logger log = Logger.getLogger(TestLog. class );调的代码序列中,Hierarchy有一个方法 void  updateParents (Logger cat),会根据类的长路径,从已有的Category中找到一个父对象.序列表如下所示:
已经初始化的Category列表中,拿到一个 Category作为父亲,(如果类路径相同,则直接返回)
序列图:



二、问题

系统一直报错:

很明显是此appeder被closed了,开始由于对log4j的源码并不是每个细节都很清楚,只得调试看下。
先找到报错的地方:

初始化的时候发现,在每个Category之前,都会先remove 此Category所包含的appender,如果此Category重复配置,那么appender就会失效.如:
     < logger  name = "com.atlantis.study.log"  additivity = "false"  >
           < level  value =  "info"  />
           < appender-ref  ref =  "CONSOLE"  />
           < appender-ref  ref =  "CONSOLE1"  />
     </ logger  >
     < logger  name = "com.atlantis.study.log"  additivity = "false"  >
           < level  value =  "info"  />
           < appender-ref  ref =  "CONSOLE"  />
           < appender-ref  ref =  "CONSOLE1"  />
     </ logger  >

删除appender的代码:
     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值