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

在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'时,这意味着由'exception引起'的其余行与父exception的那一点的剩余行相同。

例如,你会有

 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行“相遇”,然后从最上面的调用跟踪跟包装exception相同。

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

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

我喜欢这里find的例子:

 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实例包装在LowLevelException实例中, Exception类具有一个构造函数,可以接受不同的exception,将其包装)。 这导致函数a捕获MidLevelException并抛出一个HighLevelException ,它现在包装了前两个Exception实例。

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

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

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

在一篇博客文章中,我刚刚描述了如何获取不止“BatchUpdateException:失败的批处理” :设置hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory禁用hibernate中的批处理。 通常可以使用BatchUpdateException.getNextException来获取失败的原因,但在某些情况下,这可能会返回null 。 那么完全禁用批处理是有用的。