当前位置:编程学习 > JAVA >>

诡异log4j问题 求大神

好吧,这是一个貌似很简单的问题,但事实上我被困扰了好几天,一直不能解决,问题是这样的:
项目里面有一个定时器,定时做些事儿,为防止定时器内抛出异常抛到框架里面,使得定时器停掉,所以在代码里面加上了try catch, 在catch中增加了logger.error("",e);输出错误。

} catch (Exception e) {
       logger.error("Error happened!" , e);
}finally{
    b=0;
}

但后来发现,定时器报错的时候,抛出了异常,这个异常竟然是:

Exception in thread "timer" java.lang.NoClassDefFoundError: org/apache/log4j/spi/ThrowableInformation
        at org.apache.log4j.spi.LoggingEvent.<init>(LoggingEvent.java:165)
        at org.apache.log4j.Category.forcedLog(Category.java:391)
        at org.apache.log4j.Category.error(Category.java:322)
        at com.technicolor.tas.timer.VideoTimer.run(VideoTimer.java:147)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)

这里报的异常,然后我试着手动throw Exception 发现打印是正常的,现在还不知道触发这个异常的条件,但定时器一般跑上20个小时左右就会报这个错,定时器中主要任务是调用shell脚本进行hadoop统计分析

也就是说是ThrowableInformation类没有被发现,但在web项目里的lib里面确实放了log4j包版本是1.2.16, 其容器为tomcat 6,



我跟了代码发现因为我用的是logger.error("...",e);最终在代码里面

  public LoggingEvent(String fqnOfCategoryClass, Category logger,
              Priority level, Object message, Throwable throwable) {
    this.fqnOfCategoryClass = fqnOfCategoryClass;
    this.logger = logger;
    this.categoryName = logger.getName();
    this.level = level;
    this.message = message;
    if(throwable != null) { //如果 e不为空 则生成ThrowableInformation对象
      this.throwableInfo = new ThrowableInformation(throwable, logger);
    }
    timeStamp = System.currentTimeMillis();
  }

在这里生成的时候报了错,ThrowableInformation类和LoggingEvent在同一级目录下,这让我非常奇怪为什么这样,网上有说是linux打开文件的问题(Too many open files解决方法)

我已经试过,没能解决

请哪位高人帮忙看看,觉得只要有可能就说出来 我都去试试

项目起来了,log4j包确实被加载了:

--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------  logger.error("Error happened!" , e);
是这一句抛异常了么,那就给他加上try...catch...撒,也不影响其他代码。 --------------------编程问答--------------------
引用 3 楼 hucp2007 的回复:
logger.error("Error happened!" , e);
是这一句抛异常了么,那就给他加上try...catch...撒,也不影响其他代码。

这我知道  我得知道异常原因呐 这样做不能从根本上解决问题,我现在都不知道是什么原因触发的 --------------------编程问答-------------------- 要不换一种打日志方式,不用logger.error()也行啊,
有兴趣只有自己研究下源码了,看能不能找到原因。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,