我正在使用 log4j 和 tomcat。当我在 JSP、Servlet 中记录异常时:
private Logger _log = Logger.getLogger(this.getClass());
...
try{...} catch (Exception e) {
_log.error("Error refreshing all prices", e);
}
我只得到异常的第一行,没有堆栈跟踪。
2 月 17 日 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 关闭此功能,请参阅:
From http://www.oracle.com/technetwork/java/javase/relnotes-139183.html http://www.oracle.com/technetwork/java/javase/relnotes-139183.html :
服务器虚拟机中的编译器现在提供正确的堆栈回溯
对于所有“冷”内置异常。出于性能目的,当
这样的异常抛出几次后,该方法可能会被重新编译。
重新编译后,编译器可能会选择更快的策略,使用
不提供堆栈跟踪的预分配异常。禁用
完全使用预分配的异常,使用这个新标志:
-XX:-OmitStackTraceInFastThrow。
更多这里:
http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-product-and-the-fix/ http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)