Jak rejestrować wyjątek i komunikat z symbolami zastępczymi w SLF4J

85

Jakie jest prawidłowe podejście do rejestrowania zarówno komunikatu o błędzie, jak i wyjątku za pomocą SLF4J ?

Próbowałem to zrobić, ale ślad stosu wyjątków nigdy nie jest drukowany:

logger.error("Unable to parse data {}", inputMessage, e);

W tym przypadku chcę, aby wypełnić {}z inputMessagejak wylogowaniu się StackTrace wyjątku.

Jedynym sposobem, w jaki mogę to zrobić, byłoby zrobienie tego:

logger.error("Unable to parse data " + inputMessage, e);

co nie jest ładne.

pjp
źródło
Twoja pierwsza linia logger.error działa tak, jak chcesz w slf4j w wersji 1.7.25.
kiml42

Odpowiedzi:

131

Od wersji 1.6 SLF4J, SLF4J zinterpretuje ostatni parametr zgodnie z zamierzeniami, tj. Jako wyjątek. Musisz używać starszej wersji SLF4J API.

Ceki
źródło
7
Czy jest to opisane w Javadoc? Spodziewałem się znaleźć podobne informacje tutaj: slf4j.org/apidocs/org/slf4j/Logger.html
Scot
2
Wierzę ci, ale podobnie jak @Scot, miałem nadzieję, że to zachowanie zostanie udokumentowane.
Stephan
4
Scot, @Stephan - wspomniane zachowanie wydaje się być udokumentowane w ich FAQ tutaj .
Priidu Neemre
8
To jak najlepiej strzeżona tajemnica. Dzięki za wskazanie tego. Moje dalsze pytanie brzmi: dlaczego mieliby ukrywać fakt, że jest to możliwe w przypadku var-arg? Dlaczego nie mogą utworzyć nowej przeciążonej metody, która pobiera, Throwablea następnie ma zmienną argumentację? Czy są problemy z kasowaniem? Czy w innych bibliotekach jest to standard, w którym wyjątek jest przekazywany jako ostatni argument?
gaoagong
7
Zostało to (od?) Udokumentowane w FAQ: slf4j.org/faq.html#paramException . Zgadzam się, że ta funkcja powinna być lepiej udokumentowana.
Stephan202