Можем ли мы использовать все возможности log4j2, если мы используем его вместе с slf4j api?
Мы перенесли весь наш код для использования API-интерфейса slf4 для использования универсальных API-интерфейсов, однако сейчас мы думаем о переходе с log4j 1.x на log4j 2.x. Сможем ли мы использовать все возможности log4j2, если будем использовать API slf4j и log4j2 в качестве реализации?
1 ответ
API Log4j2 более богат, чем API SLF4J, и многие функции API Log4j2 не доступны через SLF4J. Смотрите ниже для деталей.
Функции реализации Log4j2, такие как Async Loggers, Lookups, Filters, Layouts и Appenders, управляются конфигурацией и доступны независимо от API ведения журнала, который вы используете в своем приложении.
Пожалуйста, также посмотрите этот ответ на другой, но связанный с этим вопрос о том, почему безопасно программировать на Log4j2 API.
10 функций API Log4j2 недоступны в SLF4J
(1) Message API позволяет приложениям регистрировать структурированные объекты в дополнение к простому тексту. Внутренне Log4j2 преобразует все, что зарегистрировано в Сообщение, и предоставление этого API открывает всевозможные возможности для приложений, чтобы взаимодействовать с нижестоящими компонентами регистрации (фильтры, макеты, дополнения). Это может быть полезно, если вы разрабатываете пользовательские компоненты в виде плагинов для Log4j2, а также когда используете встроенные. Для встроенного примера посмотрите, как StructuredDataMessage используется для детального контроля над Rfc5424Layout.
(2) Поддержка лямбды 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());
(3) Смешивание параметров в стиле {} с форматом String:: %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");
...
} // "id" and "loginId" are now removed from the ThreadContext map
(5) ThreadContext Log4j2, в дополнение к парам ключ-значение, также имеет 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, если вы регистрируете более 2 параметров.
(9) Выше, вы получите бесплатно, просто используя API Log4j2. Кроме того, если вы действительно хотите избежать создания временных объектов (как это делают некоторые интерактивные игры и финансовые приложения с малой задержкой), вы можете избежать автоматической упаковки примитивных параметров с помощью класса утилит Unbox.
(10) Использование крупномасштабной синхронизации маркерами SLF4J может повлиять на производительность для многопоточных приложений ( SLF4J-240). См. Раздел "Расширенная фильтрация" на этой странице результатов теста производительности.
Отказ от ответственности: я участвую в Log4j2.