«1. Обзор

В библиотеку Log4j 2 добавлена ​​поддержка лямбда-выражений Java 8, начиная с версии 2.4. Эти выражения могут использоваться интерфейсом Logger для включения отложенного ведения журнала.

Давайте посмотрим на краткий пример того, как мы можем использовать эту функцию.

Для получения дополнительной информации о Log4j 2 также ознакомьтесь с нашей вводной статьей.

2. Отложенное ведение журнала с помощью лямбда-выражений

Потенциальное повышение производительности приложений, использующих ведение журнала, может быть результатом отказа от расчета сообщений журнала, если соответствующий уровень журнала не включен.

Во-первых, давайте рассмотрим простой оператор журнала на уровне TRACE:

logger.trace("Number is {}", getRandomNumber());

В этом примере метод getRandomNumber() вызывается для подстановки параметра сообщения журнала независимо от того, отображаются операторы TRACE или нет. Например, если установлен уровень журнала DEBUG, log4j 2 не будет регистрировать сообщение, но метод getRandomNumber() по-прежнему будет выполняться.

Другими словами, выполнение этого метода может быть ненужным.

До добавления поддержки лямбда-выражений мы могли избежать создания сообщений, которые не регистрируются в журнале, явно проверяя уровень журнала перед выполнением оператора журнала:

if (logger.isTraceEnabled()) {
    logger.trace("Number is {}", getRandomNumer());
}

В этом случае метод getRandomNumber() только вызывается, если включен уровень журнала TRACE. Это может повысить производительность в зависимости от того, насколько дорого обходится выполнение методов, используемых для подстановки параметров.

Используя лямбда-выражения, мы можем еще больше упростить приведенный выше код:

logger.trace("Number is {}", () -> getRandomNumber());

Лямбда-выражение вычисляется, только если включен соответствующий уровень ведения журнала. Это называется ленивым ведением журнала.

Мы также можем использовать несколько лямбда-выражений для сообщения журнала:

logger.trace("Name is {} and age is {}", () -> getName(), () -> getRandomNumber());

3. Заключение

В этом кратком руководстве мы увидели, как мы можем использовать лямбда-выражения с регистраторами Log4j 2.

Как всегда, полный исходный код примера можно найти на GitHub.