Понимание параметризованных сообщений slf4j

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

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

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

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

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

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

1 ответ

Решение

Посмотрите на это так: 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.

Другие вопросы по тегам