How do I stop stacktraces truncating in logs
Lots of times in Java logs I'll get something like:
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
Does anyone know how to get the full stacktrace showing (ie show the other 113 lines)?
The JavaDocs (for Java 7) for Throwable have a pretty detailed explanation of what's going on.
When you see '...113 more', that means that the remaining lines of the 'caused by' exception are identical to the remaining lines from that point on of the parent exception.
For example, you'll have
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>.
The two stack traces 'meet' at AbstractBatcher.executeBatch, line 242, and then from then on the upward call trace is the same as the wrapping exception.
Apache's Commons Lang provides a nice util method ExceptionUtils.printRootCauseStackTrace() which prints a nested stacktrace 'upside down'. The result is much more intuitive.
If you see the result next to the original out of the printStackTrace() method, it will be clear where the '113 more' lines went.
I like the example found here:
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
Basically in the source code, main
calls function a
which calls function b
which calls ... which calls function e
. Function e
throws a LowLevelException
which causes function c to catch the LowLevelException
and throw a MidLevelException
(wrapping the LowLevelException
instance inside of the MidLevelException
instance. The Exception
class has a constructor that is capable of taking in a different exception, wrapping it). This causes function a to catch the MidLevelException
and throw a HighLevelException
which now wraps the previous two Exception
instances.
As noted in the other answers, the stack trace isn't really truncated, you are seeing the full stack trace. The .. .3 more
in my example is there because it would be redundant otherwise. If you wanted to be redundant and waste output lines, .. 3 more
could be substituted with
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
But there is no need to output these three lines, because they are already implied.
链接地址: http://www.djcxy.com/p/93142.html下一篇: 如何停止在日志中截断堆栈轨迹