it-swarm.com.de

slf4j: Wie werden formatierte Nachrichten, Objektarrays und Ausnahmen protokolliert?

Was ist der richtige Ansatz, um sowohl eine aufgefüllte Nachricht als auch einen Stack-Trace 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 Ausgabe ähnlich der folgenden erstellen:

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

Ab SLF4J 1.6.0 wird bei Vorhandensein mehrerer Parameter und wenn das letzte Argument in einer Protokollierungsanweisung eine Ausnahme darstellt, davon ausgegangen, dass der Benutzer möchte, dass das letzte Argument als Ausnahme und nicht als einfacher Parameter behandelt wird. Siehe auch relevant FAQ eintrag .

Also, schreiben (in SLF4J Version 1.7.x und höher)

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

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

387
Ceki

Zusätzlich zu @Cekis Antwort: Wenn Sie die Rückmeldung verwenden und eine Konfigurationsdatei in Ihrem Projekt einrichten (normalerweise logback.xml), können Sie das Protokoll definieren, mit dem auch die Stapelverfolgung gezeichnet wird

<encoder>
    <pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern> 
</encoder>

das% ex in-Muster macht den Unterschied

7
Yaniv