Общие сведения о параметризованных сообщениях slf4j

57
5

Я пытаюсь оценить использование slf4j + log4j2 для нашего приложения. Я прочитал в таких документах о параметризованных сообщениях в slf4j: https://www.slf4j.org/faq.html#logging_performance

Чтобы понять эту функцию, я пробовал этот код:

int a = 10;
logger.trace("test: " + a++);
logger.error("value of a: " + a);
logger.trace("test {}", a++);
logger.error("value of a " + a);

Уровень ведения журнала установлен в положение "ОШИБКА". При этом я предполагал, что в первом журнале трассировки "a" будет увеличиваться, поскольку это старый неэффективный способ ведения журнала. Но во втором журнале трассировки, поскольку я использую параметризованную регистрацию и уровень трассировки, не включен, тогда "a++" также не будет оцениваться. Но похоже, что он оценивается. Я вижу значение как 11 и 12 во 2 журналах ошибок.

Не могли бы вы помочь мне разобраться в параметризованных сообщениях slf4j, рассматривающих это поведение.

Я использую slf4j 1.6.4 и log4j2.7

спросил(а) 2017-05-23T03:15:00+03:00 3 года, 5 месяцев назад
1
Решение
70

Посмотрите на это следующим образом: будет a переменная a увеличиваться в этом коде?

someObject.someMethod(a++);

Ответ в том, что да.

В API Log4j2 или slf4j нет волшебства. В приведенном выше примере, если вы хотите увеличить a переменную, когда сообщение действительно зарегистрировано, вам нужно сделать следующее:

if (logger.isTraceEnabled()) {
logger.trace("test {}", a++);
}

Когда вы регистрируете объекты, история немного отличается. При параметризованном стиле ведения журнала библиотека протоколирования может сначала проверить уровень журнала перед форматированием строки сообщения. Если уровень журнала не включен, мы можем избежать вызова toString() объекта параметра.

Например:

// always calls toString() on the parameter
logger.trace("a time: " + LocalTime.now());

// only calls toString() if trace is enabled
logger.trace("a time: {}", LocalTime.now());

Вообще-то, я немного солгал. API-интерфейс slf4j может не иметь никакой магии, но API Log4j2 делает! :-)

Используя API Log4j2 на Java 8, вы можете получить этот код:

logger.trace("test {}", () -> a++);

Это выражение лямбда, которое оценивается только при включенном протоколе трассировки. Таким образом, вы можете написать в одной строке, что ранее требовалось 3 строки.

Это одна из причин рассмотрения программирования API Log4j2 вместо API slf4j.

ответил(а) 2017-05-23T10:56:00+03:00 3 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема