Jakie jest prawidłowe podejście do rejestrowania zarówno wypełnionego komunikatu, jak i śladu stosu wyjątku?
logger.error(
"\ncontext info one two three: {} {} {}\n",
new Object[] {"1", "2", "3"},
new Exception("something went wrong"));
Chciałbym uzyskać wynik podobny do tego:
context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...
slf4j wersja 1.6.1
{}
bardziej, kwestia smaku ...toString()
Metoda argumentów może być droga. Dzięki tej składni przekazywane jest tylko odwołanie do każdego obiektu, atoString()
metoda jest wywoływana tylko wtedy, gdy konkretny komunikat jest faktycznie rejestrowany. Do obiektów, do których odwołuje sięinfo()
wywołanie dziennika, nie zostanie wywołana ichtoString()
metoda, jeśli poziom dziennika jestWARN
wyższy lub wyższy.{}
Składnia jest przypomnieniem dla użytkowników, to nie jestString.format()
-jak operacja, czyli powinny one przechodzić obiektów zamiast ich reprezentacje ciąg.Odpowiedzi:
Począwszy od SLF4J 1.6.0, w obecności wielu parametrów i jeśli ostatni argument w instrukcji rejestrowania jest wyjątkiem, wówczas SLF4J zakłada, że użytkownik chce, aby ostatni argument był traktowany jako wyjątek, a nie prosty parametr. Zobacz także odpowiedni wpis FAQ .
Pisanie (w SLF4J w wersji 1.7.xi nowszych)
lub pisanie (w wersji SLF4J 1.6.x)
ustąpi
Dokładne dane wyjściowe będą zależeć od bazowej struktury (np. Logback, log4j itp.), A także od konfiguracji podstawowej struktury. Jeśli jednak ostatni parametr jest wyjątkiem, zostanie on zinterpretowany jako taki niezależnie od podstawowych ram.
źródło
Logger
klasy javadoc: slf4j.org/apidocs/org/slf4j/Logger.htmlOprócz odpowiedzi @Ceki, jeśli używasz funkcji Logback i instalujesz plik konfiguracyjny w swoim projekcie (zwykle logback.xml), możesz zdefiniować dziennik, aby wykreślić również ślad stosu za pomocą
% ex we wzorcu czyni różnicę
źródło