slf4j: comment enregistrer un message formaté, un tableau d’objects, une exception

Quelle est la bonne approche pour consigner à la fois un message rempli et une trace de stack 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 similaire à celle-ci:

 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 parameters 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 l’ entrée FAQ correspondante .

Donc, en écrivant (dans la version SLF4J 1.7.x et ultérieure)

  logger.error("one two three: {} {} {}", "a", "b", "c", new Exception("something went wrong")); 

ou écriture (dans la version SLF4J 1.6.x)

  logger.error("one two three: {} {} {}", new Object[] {"a", "b", "c", new Exception("something went wrong")}); 

va céder

 one two three: abc 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 de la structure sous-jacente (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 framework sous-jacent.

En plus de la réponse de @Ceki, si vous utilisez logback et configurez un fichier de configuration dans votre projet (généralement logback.xml), vous pouvez définir le journal pour tracer également la trace de la stack en utilisant

  %date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}  

le% ex dans le modèle est ce qui fait la différence