log4j 不打印堆栈跟踪以查找异常

2022-08-31 13:16:35

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

private Logger _log = Logger.getLogger(this.getClass());
...
try{...} catch (Exception e) {
    _log.error("Error refreshing all prices", e);
}

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

17-Feb 17:37:45 错误自动贡献: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

答案 1

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

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

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

更多内容在这里:

http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/


答案 2

您发布的内容应显示 javadoc 中所述的堆栈跟踪。

请注意,如果您不包含消息(并且只是调用 ),则不会记录堆栈跟踪。logger.error(ex)


推荐