java log4j2配置 - 如何在日志中停止stacktraces截断




3 Answers

当你看到'... 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行“相遇”,然后从向上调用跟踪开始,与包装异常相同。

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)对发生的事情有一个非常详细的解释。




我喜欢这里的例子:

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 bfunction b调用...调用function eFunction e抛出一个LowLevelException ,它导致函数c捕获LowLevelException并抛出MidLevelException (将LowLevelException实例包装在LowLevelException实例中MidLevelException类有一个能够接受不同异常的构造函数,包装它)。 这会导致函数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:failed batch” :设置hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory来禁用hibernate中的批处理。 通常可以使用BatchUpdateException.getNextException来获取失败的原因,但在某些情况下,这可能会返回null 。 然后完全禁用批处理很有用。




Related

java exception stack-trace