web-dev-qa-db-fra.com

slf4j: comment enregistrer un message formaté, un tableau d'objets, une exception

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

252
rowe

À 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.

387
Ceki

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

7
Yaniv