Jhonney的专栏

   ----人见人爱
随笔 - 49, 文章 - 1, 评论 - 23, 引用 - 0
数据加载中……

关于log4j重复输出的问题

   今天接着昨天的工作干,把自己写的框架和程序结合,具体测试一下框架。代码全部跑通后,一个师妹问了一个关于JDBC的问题,由于以前开发多数底层要么用的工具,要么别人已经封装好了,所以对这个问题弄了半天,关于ResultSet中sql用select a.*,b* from..的问题,问题是程序老是报超出边界的错误,结论是像前面的sql语句java只认为只有2列,解决办法需要写清各个列。
   由于这件事的问题,我感到项目中他们数据库底层没有统一,且没有调试工具,我写的框架其实很早就写好了,但一直没有给他们讲,所以今天想写个关于框架使用的ppt,
   这时就碰到了Log4j重复输出的问题,摸索一会儿,感觉应该出在log4j的logger继承上,但一直找不到原因,后来偶尔翻到刑红瑞的blog,才知道错误,错误解决办法:
【quto to 贾斯汀的网志
log4j重复输出log信息原因和解决办法
                                       
log4j的logger(旧版本称logger)是层次结构的,子logger会继承父logger的属性,appender也是可继承的属性,这常常容易导致配置错误而引起的log4j输出重复的log信息
log4j的logger(旧版本称logger)是层次结构的,子logger会继承父logger的属性,appender也是可继承的属性,这常常容易导致配置错误而引起的log4j输出重复的log信息。如果在在父子logger中引用了相同的appender时,例子:
    
<logger name="com.erry.model">
        
<level value="DEBUG"/>
        
<appender-ref ref="CONSOLE"/>
    
</logger>
    
<logger name="com.erry.service">
        
<level value="DEBUG"/>
        
<appender-ref ref="CONSOLE"/>
    
</logger>
    
<root>
        
<level value="WARN"/>
        
<appender-ref ref="CONSOLE"/>
    
</root>

由于子logger(com.erry.model和com.erry.service)继承了父logger(ROOT)的appender,加上其本身引用的appender总共会在2个appender上输出消息,由于这两个appender实际上是同一个appender,所以结果会是相同的消息被重复输出。解决这个问题很简单,只要注意不要重复引用父logger已经引用的appender即可。上述例子的正确配置如下:
    
<logger name="com.erry.model">
        
<level value="DEBUG"/>
    
</logger>
    
<logger name="com.erry.service">
        
<level value="DEBUG"/>
    
</logger>
    
<root>
        
<level value="WARN"/>
        
<appender-ref ref="CONSOLE"/>
    
</root>



posted on 2007-03-23 18:14 Jhonney 阅读(2243) 评论(1)  编辑  收藏

评论

# re: 关于log4j重复输出的问题  回复  更多评论   

感谢分享~~
2011-07-27 16:53 | herry

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


网站导航: