诡异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...撒,也不影响其他代码。 --------------------编程问答--------------------
这我知道 我得知道异常原因呐 这样做不能从根本上解决问题,我现在都不知道是什么原因触发的 --------------------编程问答-------------------- 要不换一种打日志方式,不用logger.error()也行啊,
有兴趣只有自己研究下源码了,看能不能找到原因。
补充:Java , Web 开发