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?
Habituellement:
log.warn("message", e);
Mais cela dépend aussi de votre cadre de journalisation.
Vous pouvez utiliser
logger.log(Level.WARN, "logged exception", ex);
ou
logger.warn("logged exception", ex);
Ressources:
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);
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
.
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"))
);
Peut-être recherchez-vous quelque chose comme ceci: http://www.javapractices.com/topic/TopicAction.do?Id=78
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")));