Должны ли мы использовать isDebugEnabled () при регистрации вычисленных данных с помощью Logback? - PullRequest
0 голосов
/ 14 января 2020

Хотя в некоторых руководствах, например здесь ( Параметризованное ведение журнала раздел), говорится, что сообщение Logback {} параметризация помогает нам избежать ненужных вычислений в данных регистрации (если уровень ведения журнала не DEBUG):

logger.debug("The bonus for employee {} is {}", 
   employee.getName(), employeeService.calculateBonus(employee));

Я проверил (при версии logback 1.2.3), что эта оптимизация работает только для ненужного toString() объекта параметра - как работает для log4j .

Logback документация не охватывает эту деталь.

Итак, мы должны использовать isDebugEnabled () для всех «дорогие» рубки, не так ли?

Ответы [ 2 ]

1 голос
/ 14 января 2020

Взгляните на пример здесь

Начиная с версии 2.4, в интерфейс Logger были добавлены методы для поддержки лямбда-выражений. Новые методы позволяют клиентскому коду лениво регистрировать сообщения без явной проверки, включен ли запрошенный уровень журнала. Например, ранее можно было написать:

// pre-Java 8 style optimization: explicitly check the log level
// to make sure the expensiveOperation() method is only called if necessary
 if (logger.isTraceEnabled()) {
     logger.trace("Some long-running operation returned {}", expensiveOperation());
 }

С Java 8 тот же эффект может быть достигнут с помощью лямбда-выражения:

// Java-8 style optimization: no need to explicitly check the log level:
// the lambda expression is not evaluated if the TRACE level is not enabled
logger.trace("Some long-running operation returned {}", () -> expensiveOperation());
1 голос
/ 14 января 2020

Когда вы делаете вызов метода, например, employeeService.calculateBonus(employee), вы вызываете этот метод. Просто как тот. Таким образом, вы рассчитываете премию сотрудника каждый раз, когда эта строка попадает. Здесь нет ленивых вычислений.

Возможность использования log.isDebugEnabled() зависит от ситуации. В этой ситуации, если этот вызов метода является дорогостоящим, его следует включить в проверку с включенной отладкой.

В случае получателей это обычно не требуется. Так, например, я бы не обернул это в проверку isDebugEnabled:

log.debug("Calculating bonus for employee {} {}", employee.firstName(), employee.lastName());

Это простые методы получения, которые возвращают String, поэтому дорогостоящие вычисления не выполняются.

...