web-dev-qa-db-fra.com

Comment écrivez-vous une trace de pile complète dans le journal?

J'attrapais une exception et j'essayais d'écrire la trace de la pile dans les journaux comme ceci:

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 on dit seulement

Java.lang.NullPointerException

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

16
Linc

Habituellement:

log.warn("message", e);

Mais cela dépend aussi de votre cadre de journalisation.

34
Peter Štibraný

Vous pouvez utiliser 

logger.log(Level.WARN, "logged exception", ex);

ou

logger.warn("logged exception", ex);

Ressources:

9
Colin Hebert

En utilisant log4j cela est fait avec:

logger.error("An error occurred", exception);

Le premier argument est un message à afficher, le second est l'exception (jetable) dont le stacktrace est enregistré.

Une autre option est commons-logging, où c'est la même chose:

log.error("Message", exception);

Avec Java.util.logging, cela peut être fait via:

logger.log(Level.SEVERE, "Message", exception);
4

Dans votre méthode d'exception, la variable String sous-jacente contenant le message est null.

La réponse ci-dessus, maintenant rayée, est toujours valable, sauf que e n'est pas null, mais la variable d'instance privée detailMessage de la classe Throwable est null, c'est pourquoi e.getMessage() est la chaîne null, mais e.toString() (qui appelle sous-jacent null detailMessage.toString) jette une NullPointerException.

3
Noel M

Si vous utilisez 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"))
        );
2
nishant

Peut-être recherchez-vous quelque chose comme ceci: http://www.javapractices.com/topic/TopicAction.do?Id=78

1
Joelio

Si vous utilisez une version de Java antérieure à 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")));
0
RafaJR