log4j源码解析及一个log4j:ERROR Attempted to append to closed appender named 的问题
2012-06-08 14:07
267 查看
一、log4j源码解析
最近出现一个问题,弄得我不得不把log4j的源代码读了一篇。
如果自己不想写代码,可以下载此代码:https://github.com/lwwcl1314/atlantis/tree/master/common/src/main/java/com/atlantis/study/log
先讲下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就会失效.如:
https://github.com/lwwcl1314/atlantis/blob/master/common/src/main/resources/log4j.xml
[align=left] <logger name="com.atlantis.study.log" additivity="false" >[/align]
[align=left] <level value= "info" />[/align]
[align=left] <appender-ref ref= "CONSOLE" />[/align]
[align=left] <appender-ref ref= "CONSOLE1" />[/align]
[align=left] </logger >[/align]
[align=left] <logger name="com.atlantis.study.log" additivity="false" >[/align]
[align=left] <level value= "info" />[/align]
[align=left] <appender-ref ref= "CONSOLE" />[/align]
[align=left] <appender-ref ref= "CONSOLE1" />[/align]
[align=left] </logger >[/align]
[align=left]删除appender的代码:[/align]
最近出现一个问题,弄得我不得不把log4j的源代码读了一篇。
如果自己不想写代码,可以下载此代码:https://github.com/lwwcl1314/atlantis/tree/master/common/src/main/java/com/atlantis/study/log
先讲下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就会失效.如:
https://github.com/lwwcl1314/atlantis/blob/master/common/src/main/resources/log4j.xml
[align=left] <logger name="com.atlantis.study.log" additivity="false" >[/align]
[align=left] <level value= "info" />[/align]
[align=left] <appender-ref ref= "CONSOLE" />[/align]
[align=left] <appender-ref ref= "CONSOLE1" />[/align]
[align=left] </logger >[/align]
[align=left] <logger name="com.atlantis.study.log" additivity="false" >[/align]
[align=left] <level value= "info" />[/align]
[align=left] <appender-ref ref= "CONSOLE" />[/align]
[align=left] <appender-ref ref= "CONSOLE1" />[/align]
[align=left] </logger >[/align]
[align=left]删除appender的代码:[/align]
相关文章推荐
- log4j源码解析及一个log4j:ERROR Attempted to append to closed appender named 的问题
- log4j:ERROR Attempted to append to closed appender named 的问题
- log4j:ERROR Attempted to append to closed appender named [CONSOLE].
- log4j:ERROR Attempted to append to closed appender named [INFO-ALL].
- 这个bug很简单-log4j:ERROR Attempted to append to closed appender named
- log4j:ERROR Attempted to append to closed appender named [null].
- log4j:ERROR Attempted to append to closed appender named [null].
- log4j:ERROR Attempted to append to closed appender named [null].
- log4j:ERROR Attempted to append to closed appender named [null].
- 解决 log4j:ERROR Failed to rename,不需要修改源码。同时解决工程重复加载的问题。
- log4j:ERROR Flume append() failed.(flume-ng-log4jappender-1.4.0.jar bug)
- 深入springMVC------文件上传源码解析(上篇) 最近在项目中,使用springmvc 进行上传文件时,出现了一个问题: org.springframework.web.multipart
- Android 开发过程中遇到了一个问题 小记录一下 ERROR: In <declare-styleable> BorderLinearLayout, unable to find attribu
- log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.lo .
- log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.lo
- log4j:ERROR Failed to load driver问题
- log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
- log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.lo
- android开发问题:Attempted to access a cursor after it has been closed.
- 解决LOG4J:ERROR Failed to rename的问题