2010-09-15 6 views
12

J'attrapait une exception et d'essayer d'écrire la trace de la pile dans les journaux comme ceci:Comment écrire une trace de pile complète dans le journal?

log.warn(e.getMessage()); 

Mais tout ce qu'il a dit était

null 

Alors je l'ai changé pour

log.warn(e.toString()); 

Et maintenant il dit seulement

java.lang.NullPointerException 

Comment écrire la trace de la pile complète dans le journal pour voir où cette exception est générée dans l'application?

Répondre

28

Habituellement:

log.warn("message", e); 

Mais cela dépend de votre cadre de l'exploitation forestière aussi.

3

Dans votre méthode d'exception, le String sous-jacente qui contient le message est null.

La réponse ci-dessus, maintenant rayées, détient toujours, sauf que e est non nul, mais la variable d'instance privée detailMessage la classe Throwable est nulle, ce qui explique pourquoi e.getMessage() est la chaîne null, mais e.toString() (qui appels sous-jacents nulldetailMessage.toString) émet un NullPointerException.

+1

si e était nulle, connectez-vous. avertir (e.getMessage()); lancerait une exception et n'imprimerait pas "null". –

+0

Non ce ne serait pas, il lancerait un NPE –

+0

Désolé, j'ai mal lu votre commentaire –

1

En utilisant log4j cela se fait avec:

logger.error ("Une erreur est survenue", exception); Le premier argument est un message à afficher, le second est l'exception (throwable) dont la stacktrace est enregistrée.

Une autre option est commons-logging, où il est le même:

log.error ("Message", exception);

Avec java.util.logging cela peut se faire via:

logger.log (niveau.SÉVÈRE, "Message", exception);

1

Si vous en utilisant java8 vous pouvez effectuer les opérations suivantes:

 LOGGER.error("Caught exception while methodX. Please investigate: " 
       + exception 
       + Arrays.asList(exception.getStackTrace()) 
       .stream() 
       .map(Objects::toString) 
       .collect(Collectors.joining("\n")) 
     ); 
+0

Cela fonctionne très bien et il est également utile lors des sessions de débogage lorsque les exceptions ne sont pas correctement enregistrées. – alexandrul

0

Si vous utilisez une version Java précédente à 8, vous pouvez essayer ceci:

  LOGGER.error("Error al recuperar proveedores de la base de datos: " + 
      e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){ 
        @Override 
        public Object apply(Object t) { 
         return t.toString(); 
        } 
       }).collect(Collectors.joining("\n"))); 
Questions connexes