log4j不打印异常的堆栈跟踪

我在tomcat中使用log4j。当我在JSP中记录异常时,servlet:

private Logger _log = Logger.getLogger(this.getClass());

...

try{...} catch (Exception e) {

_log.error("Error refreshing all prices", e);

}

我只得到异常的第一行,没有堆栈跟踪。

17-Feb

17:37:45错误AutoContrib:175-发布csv文件时发生异常:java.lang.ArrayIndexOutOfBoundsException

根本不是很有帮助!

我的log4j.properties文件(/tomcat/common/classes/log4j.properties)看起来像这样:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n

log4j.appender.stdout.threshold=info

log4j.appender.file=org.apache.log4j.RollingFileAppender

log4j.appender.file.maxFileSize=5000KB

log4j.appender.file.maxBackupIndex=10

log4j.appender.file.File=${catalina.home}/logs/web.log

log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n

log4j.appender.file.threshold=info

log4j.rootLogger=debug, stdout, file

回答:

实际上,这可能是由于热点优化所致:在抛出一定数量的相同异常后,它将停止打印跟踪。可以使用VM arg将其关闭,请参见:

从http://www.oracle.com/technetwork/java/javase/relnotes-139183.html:

现在,服务器VM中的编译器为所有“冷”内置异常提供了正确的堆栈回溯。为了提高性能,当几次抛出此类异常时,可以重新编译该方法。重新编译后,编译器可以使用不提供堆栈跟踪的预分配异常来选择更快的策略。要完全禁用预分配的异常,请使用以下新标志:-XX:-OmitStackTraceInFastThrow。

更多内容:

http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-

traces-in-production-and-the-fix/

以上是 log4j不打印异常的堆栈跟踪 的全部内容, 来源链接: utcz.com/qa/408518.html

回到顶部