web-dev-qa-db-fra.com

Imprimer la pile d'appels complète sur printStackTrace ()?

J'ai besoin d'écrire une petite application d'analyse de journal pour traiter certains fichiers journaux générés par une bibliothèque de sources fermées tierce (ayant un enregistreur personnalisé à l'intérieur) utilisée dans mon projet.

Dans le cas d'une entrée d'exception dans le journal, je dois collecter des informations agrégées sur les méthodes impliquées le long de la trace de la pile du haut vers le lieu réel de l'exception.

Malheureusement, par défaut Java printStackTrace () n'imprime pas toutes les méthodes de la pile d'appels mais jusqu'à un certain nombre et le reste est simplement référencé comme 16 more....

Si je pouvais intercepter l'exception moi-même, j'utiliserais getStackTrace () et l'imprimerais moi-même, mais la cause première n'est jamais incluse dans l'exception que cette bibliothèque lève.

Existe-t-il un moyen de demander Java pour imprimer la pile d'appels entière dans la pile de traces?

En dehors de ma situation, les cadres de journalisation communs ont-ils une option pour cela?

Edit: Le programme s'exécute sur la machine virtuelle Java de Sun avec JDK 1.5.0_09. Aucune option pour changer cela.

42
akarnokd

voici une explication des lignes 'causé par' et '... n plus' dans la trace imprimée. voir aussi JavaDoc pour printStackTrace . vous pourriez ne pas avoir de travail à faire.

Notez la présence de lignes contenant les caractères "...". Ces lignes indiquent que le reste de la trace de pile pour cette exception correspond au nombre indiqué de trames à partir du bas de la trace de pile de l'exception qui a été provoquée par cette exception (l'exception "englobante"). Ce raccourci peut réduire considérablement la longueur de la sortie dans le cas courant où une exception encapsulée est levée à partir de la même méthode que l '"exception causative" est interceptée.

29
akf

Vous ne pouvez pas faire quelque chose avec Thread.currentThread().getStackTrace()?

Voici un exemple vraiment simple qui appelle une méthode récursivement 20 fois, puis vide la pile du thread actuel.

public class Test {
    public static void main(String[] args) {
        method();
    }

    static int x = 0;
    private static void method() {
        if(x>20) {
            StackTraceElement[] elements = Thread.currentThread().getStackTrace();

            for(int i=0; i<elements.length; i++) {
                System.out.println(elements[i]);
            }
        }
        else {
            x++;
            method();
        }
    }
}
5
A_M