Quelle est la bonne approche pour consigner à la fois un message rempli et une trace de pile de l'exception?
logger.error(
"\ncontext info one two three: {} {} {}\n",
new Object[] {"1", "2", "3"},
new Exception("something went wrong"));
Je voudrais produire une sortie semblable à ceci:
context info one two three: 1 2 3
Java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...
sLF4J version 1.6.1
À partir de SLF4J 1.6.0, en présence de plusieurs paramètres et si le dernier argument d'une instruction de journalisation est une exception, SLF4J supposera que l'utilisateur souhaite que le dernier argument soit traité comme une exception et non comme un paramètre simple. Voir aussi le entrée pertinente FAQ .
Donc, écrire (dans SLF4J version 1.7.x et ultérieure)
logger.error("one two three: {} {} {}", "a", "b",
"c", new Exception("something went wrong"));
ou écriture (dans SLF4J version 1.6.x)
logger.error("one two three: {} {} {}", new Object[] {"a", "b",
"c", new Exception("something went wrong")});
va céder
one two three: a b c
Java.lang.Exception: something went wrong
at Example.main(Example.Java:13)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at ...
La sortie exacte dépendra du framework sous-jacent (par exemple, logback, log4j, etc.) ainsi que de la configuration du framework sous-jacent. Cependant, si le dernier paramètre est une exception, il sera interprété comme tel quel que soit le cadre sous-jacent.
En plus de la réponse de @Ceki, si vous utilisez la journalisation et configurez un fichier de configuration dans votre projet (habituellement logback.xml), vous pouvez définir le journal pour tracer la trace de la pile à l'aide de
<encoder>
<pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern>
</encoder>
c'est le motif% ex qui fait la différence