如何停止堆栈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 b
。 Function 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
。 那么完全禁用批处理是有用的。