如何停止在日志中截断堆栈轨迹

Java日志中的很多次我会得到如下所示的内容:

Caused by: java.sql.BatchUpdateException: failed batch
    at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.java:1102)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.java:514)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 113 more

有谁知道如何获得完整的堆栈显示(即显示其他113行)?


Throwable的JavaDocs(用于Java 7)对发生的事情有非常详细的解释。


当您看到'... 113 more'时,这意味着由'异常引起'的其余行与父异常的那一点的其余行相同。

例如,你会有

com.something.XyzException
  at ...
  at ...
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
  at ... <the other 113 lines are here>...
Caused by: <the above>.

这两个堆栈跟踪在AbstractBatcher.executeBatch第242行“相遇”,然后从上行调用跟踪与包装异常相同。


Apache的Commons Lang提供了一个很好的实用方法ExceptionUtils.printRootCauseStackTrace(),它可以“颠倒”地打印一个嵌套的堆栈跟踪。 结果更直观。

如果您在printStackTrace()方法的原始视图旁看到结果,则会清楚'113 more'行的位置。


我喜欢这里找到的例子:

HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more

基本上在源代码中, main调用function a调用调用function e function bFunction e抛出一个LowLevelException导致函数c赶上LowLevelException和抛出MidLevelException (包裹LowLevelException的内部实例MidLevelException实例。该Exception类有一个构造,其能够取入一个不同的异常,其包装)。 这导致函数a捕获MidLevelException并抛出一个HighLevelException ,它现在包装前两个Exception实例。

正如在其他答案中指出的那样,堆栈跟踪并未真正被截断,您可以看到完整的堆栈跟踪。 在我的例子中.. .3 more ,因为否则它将是多余的。 如果你想成为多余的和浪费的输出线, .. 3 more可以用.. 3 more替代

at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)

但是没有必要输出这三条线,因为它们已经隐含了。

链接地址: http://www.djcxy.com/p/93141.html

上一篇: How do I stop stacktraces truncating in logs

下一篇: Print full call stack on printStackTrace()?