Подтвердить что ты не робот

Можем ли мы использовать все функции log4j2, если мы будем использовать его вместе с slf4j api

Мы перенесли весь наш код, чтобы использовать slf4 apis для использования generic apis, однако теперь мы думаем об обновлении с log4j 1.x до log4j 2.x. Смогу ли мы использовать все функции log4j2, если мы используем slf4j api и реализацию как log4j2?

4b9b3361

Ответ 1

API Log4j2 богаче, чем API SLF4J, и многие функции API Log4j2 недоступны через SLF4J. Подробнее см. Ниже.

Особенности реализации Log4j2, такие как Async Loggers, Lookups, Filters, Layouts и Appenders, контролируются с настройкой и доступны независимо от API ведения журнала, который вы используете в своем приложении.

Также см. этот ответ на другой, но связанный с ним вопрос о том, почему безопасно программировать API Log4j2.

10 Функции API Log4j2 API недоступны в SLF4J

(1) Message API позволяет приложениям регистрировать структурированные объекты в дополнение к простому тексту. Внутренне Log4j2 преобразует все, что регистрируется в Message, и раскрытие этого API открывает все возможности для взаимодействия приложений с нисходящими компонентами протоколирования (фильтрами, макетами, добавками). Это может быть полезно, если вы разрабатываете пользовательские компоненты в качестве плагинов для Log4j2, а также когда вы используете встроенные. Для встроенного примера см., Как StructuredDataMessage используется для мелкомасштабного управления Rfc5424Layout.

(2) Java 8 поддержка lambda позволяет лениво создавать параметры или сообщения журналов без явной проверки, включен ли запрошенный уровень журнала.

// 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());

(3) Смешивание параметров {} с параметрами String:: format %s %d. Стиль {} имеет лучшую производительность и может использоваться с любым типом параметра, но стиль printf дает мелкозернистый контроль над форматированием. Log4j2 позволяет легко смешивать эти стили параметров. Например:

logger.debug("Opening connection to {}...", someDataSource);
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());

(4) CloseableThreadContext предлагает некоторое дополнительное удобство по сравнению с обычным ThreadContext (MDC) в SLF4J: он автоматически удаляет элементы, когда вы сделанный. Например:

// Add to the ThreadContext map for this try block only;
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext
        .put("id", UUID.randomUUID().toString())
        .put("loginId", session.getAttribute("loginId"))) {
    logger.debug("Message 1");
    // call some other code that also does logging 
    ...
    logger.debug("Message 2");
    ...
} // "is" and "loginId" are now removed from the ThreadContext map

(5) Log4j2 ThreadContext, помимо пар ключ-значение, также имеет методы push и pop для поддержки (что раньше называлось NDC в Log4j 1).

(6) SLF4J не поддерживает уровень журнала FATAL.

(7) Log4j2 поддерживает настраиваемые уровни журналов. Они могут использоваться с методами log, например: logger.log(Level.getLevel("FINE"), "... msg"), или вы можете создать специальную оболочку логгера с помощью удобных методов для ваших собственных уровней журнала.

(8) API Log4j2 принимает любой объект, а не только строки. Это одна из вещей, которые позволяют Log4j2 быть "без мусора ", то есть он избежит выделения новых объектов. Ваш объект регистрируется без создания временных строк, если это Number, CharSequence или когда он реализует интерфейс (Log4j2) StringBuilderFormattable.

API Log4j2 также избегает создания массивов vararg, если вы регистрируете 10 параметров или меньше. SLF4J создает массивы vararg, если вы регистрируете более двух параметров.

(9) Вышеупомянутое вы получите бесплатно, просто используя API Log4j2. Кроме того, если вам действительно нужно избегать создания временных объектов (например, некоторые интерактивные игры и финансовые приложения с низкой задержкой), вы можете избежать примитивных параметров автоматического бокса с помощью Unbox.

(10) SLF4J Использование маркеров крупнозернистой синхронизацией может оказать влияние на производительность многопоточных приложений (SLF4J-240). См. Раздел "Расширенная фильтрация" этой результатов теста производительности.


Отказ от ответственности: я вношу свой вклад в Log4j2.