slf4j: как записать отформатированное сообщение, массив объектов, исключение - PullRequest
249 голосов
/ 16 июня 2011

Каков правильный подход для регистрации заполненного сообщения и трассировки стека исключения?

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

Я хотел бы получить вывод, подобный следующему:

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

slf4j версия 1.6.1

Ответы [ 2 ]

380 голосов
/ 16 июня 2011

Начиная с SLF4J 1.6.0, при наличии нескольких параметров и если последний аргумент в операторе ведения журнала является исключением, SLF4J будет предполагать, что пользователь хочет, чтобы последний аргумент рассматривался как исключение, а не как простойпараметр.См. Также соответствующую запись FAQ .

Итак, запись (в SLF4J версии 1.7.x и более поздних)

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

или запись (в SLF4J версии 1.6.x)

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

даст

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

Точный вывод будет зависеть от базовой структуры (например, logback, log4j и т. Д.), А также от конфигурации базовой структуры.Однако, если последний параметр является исключением, он будет интерпретироваться как таковой независимо от базовой структуры.

7 голосов
/ 28 января 2014

В дополнение к ответу @Ceki, если вы используете logback и настраиваете файл конфигурации в своем проекте (обычно logback.xml), вы можете определить журнал для построения трассировки стека, используя

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

% ex в шаблоне - вот что имеет значение

...