Как правильно регистрировать заполненное сообщение и трассировку стека исключения?
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
{}
больше, дело вкуса ...toString()
Метод аргументов может быть дорогим. С этим синтаксисом передается только ссылка на каждый объект, иtoString()
метод вызывается только в том случае, если конкретное сообщение действительно регистрируется. Объекты, на которые ссылаются приinfo()
вызове журнала, не будут вызывать свойtoString()
метод, если уровень журнала равенWARN
или выше.{}
Синтаксис напоминает пользователям , что это неString.format()
-как операция, то есть они должны передавать объекты , а не строковые представления их.Ответы:
Начиная с SLF4J 1.6.0, при наличии нескольких параметров и если последний аргумент в операторе ведения журнала является исключением, тогда SLF4J будет предполагать, что пользователь хочет, чтобы последний аргумент рассматривался как исключение, а не как простой параметр. Смотрите также соответствующую запись FAQ .
Итак, написание (в SLF4J версии 1.7.x и выше)
или писать (в SLF4J версии 1.6.x)
даст
Точный вывод будет зависеть от базовой структуры (например, logback, log4j и т. Д.), А также от того, как настроена базовая структура. Однако, если последний параметр является исключением, он будет интерпретироваться как таковой независимо от базовой структуры.
источник
Logger
класса javadoc: slf4j.org/apidocs/org/slf4j/Logger.htmlВ дополнение к ответу @Ceki: если вы используете logback и настраиваете файл конфигурации в своем проекте (обычно logback.xml), вы можете определить журнал для построения трассировки стека, используя
% ex в шаблоне - вот что делает разницу
источник