How do I stop stacktraces truncating in logs

后端 未结 6 1312
逝去的感伤
逝去的感伤 2020-11-27 17:39

Lots of times in Java logs I\'ll get something like:

Caused by: java.sql.BatchUpdateException: failed batch
    at org.hsqldb.jdbc.jdbcStatement.executeBatch         


        
相关标签:
6条回答
  • 2020-11-27 17:48

    In a blog post I just described how to get more than just "BatchUpdateException: failed batch": set hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory to disable batching in hibernate. Normally one can use BatchUpdateException.getNextException to get the reason of the failure, but in some cases this may return null. Then it's useful to disable batching completely.

    0 讨论(0)
  • 2020-11-27 17:52

    Increase -XX:MaxJavaStackTraceDepth JVM option.

    0 讨论(0)
  • 2020-11-27 18:01

    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.

    0 讨论(0)
  • 2020-11-27 18:03

    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.

    0 讨论(0)
  • 2020-11-27 18:03

    I found this useful to get the whole picture. Get a full stack trace of the Exception and the cause (which often shows repeated lines from the main Exception, but can be helpful).

            ... catch( Exception e) ...
    
            ... catch( NoClassDefFoundError e)
            {
    
                    for(StackTraceElement ste: e.getStackTrace())
                    {
                        System.out.println(ste);
                    }
    
                    if( e.getCause()!=null )
                    {
                        for(StackTraceElement ste: e.getCause().getStackTrace())
                        {
                            System.out.println(ste);
                        }
                    }
            }
    
    0 讨论(0)
  • 2020-11-27 18:08

    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.

    0 讨论(0)
提交回复
热议问题