web-dev-qa-db-fra.com

Comment puis-je arrêter la troncature de stacktraces dans les journaux

Beaucoup de fois dans les journaux Java, je vais obtenir quelque chose comme:

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

Est-ce que quelqu'un sait comment obtenir la totalité de la pile (c'est-à-dire afficher les 113 autres lignes)?


Les JavaDocs (pour Java 7) pour Throwable ont une explication assez détaillée de ce qui se passe.

68
SCdF

Lorsque vous voyez "... 113 autres", cela signifie que les lignes restantes de l'exception "provoqué par" sont identiques aux lignes restantes à partir de ce point de l'exception parent.

Par exemple, vous aurez

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>.

Les deux traces de pile "se rencontrent" sur AbstractBatcher.executeBatch, ligne 242, puis à partir de là, la trace d'appel ascendante est identique à l'exception d'habillage.

67
Cowan

Apache's Commons Lang fournit une méthode Nice util ExceptionUtils.printRootCauseStackTrace () qui affiche un stacktrace imbriqué "à l'envers". Le résultat est beaucoup plus intuitif. 

Si vous voyez le résultat à côté de l'original en dehors de la méthode printStackTrace (), l'emplacement des «113 autres lignes» sera clairement indiqué.

20
Hes Siemelink

J'aime l'exemple trouvé ici :

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

Essentiellement dans le code source, main appelle function a qui appelle function b qui appelle ... qui appelle function e.Function e lève une LowLevelException qui amène la fonction c à intercepter la LowLevelException et à lancer une MidLevelException (enveloppant l'instance LowLevelException à l'intérieur de l'instance MidLevelException La classe Exception a un constructeur capable de prendre une exception différente, en l’enveloppant). Cela a pour effet que la fonction a attrape la MidLevelException et jette une HighLevelException qui enveloppe maintenant les deux précédentes instances Exception

Comme indiqué dans les autres réponses, la trace de la pile n'est pas vraiment tronquée, vous voyez la trace complète de la pile. Le .. .3 more dans mon exemple est là car il serait redondant sinon. Si vous voulez être redondant et que les lignes de sortie sont vides, vous pouvez remplacer .. 3 more par 

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

Mais il n'est pas nécessaire de sortir ces trois lignes, car elles sont déjà impliquées.

12
Kevin Wheeler

Augmentez l’option -XX:MaxJavaStackTraceDepth de la machine virtuelle Java. 

0

J'ai trouvé cela utile pour avoir une image complète. Obtenez une trace complète de la pile de l'exception et la cause (qui affiche souvent des lignes répétées de l'exception principale, mais peut être utile).

        ... 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
DAB