slf4j: wie man formatierte Nachricht, Objektarray, Ausnahme protokolliert

Was ist der richtige Ansatz, um sowohl eine aufgefüllte Nachricht als auch eine Stack-Ablaufverfolgung der Ausnahme zu protokollieren?

logger.error( "\ncontext info one two three: {} {} {}\n", new Object[] {"1", "2", "3"}, new Exception("something went wrong")); 

Ich möchte eine ähnliche Ausgabe erzeugen:

 context info one two three: 1 2 3 java.lang.Exception: something went wrong stacktrace 0 stacktrace 1 stacktrace ... 

slf4j Version 1.6.1

Ab SLF4J 1.6.0 wird SLF4J bei Vorhandensein mehrerer Parameter und wenn das letzte Argument in einer Logging-statement eine Ausnahme ist, davon ausgehen, dass der Benutzer das letzte Argument als Ausnahme und nicht als einfachen Parameter behandeln möchte. Siehe auch den entsprechenden FAQ-Eintrag .

Also, Schreiben (in SLF4J Version 1.7.x und später)

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

oder schreiben (in SLF4J Version 1.6.x)

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

wird nachgeben

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

Die genaue Ausgabe hängt vom zugrundeliegenden Framework (z. B. Logback, log4j usw.) sowie davon ab, wie das zugrundeliegende Framework konfiguriert ist. Wenn der letzte Parameter jedoch eine Ausnahme darstellt, wird er unabhängig vom zugrunde liegenden Framework als solcher interpretiert.

Zusätzlich zu @Cekis Antwort: Wenn Sie Logback verwenden und in Ihrem Projekt eine Konfigurationsdatei (normalerweise logback.xml) einrichten, können Sie das Protokoll auch so definieren, dass es den Stack-Trace grafisch darstellt

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

das% ex im Muster macht den Unterschied aus