Стоит ли использовать slf4j с log4j2


Я не могу решить, следует ли использовать slf4j или не с log4j2. Основываясь на онлайн-сообщениях, не похоже, что он будет иметь какой-либо хит производительности, но это действительно необходимо.

также эти пункты правят в пользу log4j2:

  • SLF4J заставляет ваше приложение регистрировать строки. Log4j 2 API поддерживает ведение журнала любой CharSequence, если вы хотите записать текст, но также поддерживает ведение журнала любого объекта как есть.
  • API Log4j 2 предлагает поддержку для сообщения регистрации объекты, лямбда-выражения Java 8 и ведение журнала без мусора (он избегает создания массивов vararg и избегает создания строк при регистрации объектов CharSequence).
1 59

1 ответ:

вперед: программа для log4j2 API вместо slf4j

это безопасно: Log4j2 API предлагает те же самые гарантии, что и slf4j - и многое другое.

теперь, когда Log4j2 сам разделен на API и модуль реализации, больше нет никакого значения в использовании SLF4J.

Да, это хорошая инженерная практика, чтобы держать свои варианты открытыми. Возможно, вы захотите перейти к другой реализации ведения журнала позже.

за последние 10 лет или так, дом такой гибкости в ваше приложение, используя API оболочки, как SLF4J. Эта гибкость не приходит бесплатно но недостатком этого подхода является то, что ваше приложение не может использовать богатый набор функций базового библиотека журналов.

Log4j2 предлагает решение, которое не требует, чтобы ваше приложение было ограничено самым низким общим знаменателем.

выпускной клапан: log4j-to-slf4j

Log4j2 включает в себя log4j-to-slf4j модуль моста. Любое приложение, закодированное против API Log4j2, может в любое время переключить реализацию поддержки на любую реализацию, совместимую с slf4j.

log4j-to-slf4j

Как уже упоминалось в вопросе, использование API Log4j2 напрямую предлагает больше функциональности и имеет некоторые нефункциональные преимущества по сравнению с использованием API-оболочки, такого как slf4j:

  • API сообщений
  • лямбды для ленивого ведения журнала
  • регистрировать любой объект, а не только строки
  • без мусора: избегайте создания varargs или создания строк, где это возможно
  • CloseableThreadContext автоматически удаляет элементы из MDC, когда вы закончите с ними

(см. 10 Log4j2 API функции недоступны в SLF4J для более подробной информации.)

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

SLF4J по-прежнему ваш предохранительный клапан, это просто не означает, что ваше приложение должно кодировать против API SLF4J больше.


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


Update: кажется, есть некоторая путаница в том, что программирование API Log4j2 каким-то образом вводит "фасад для фасада". Нет никакой разницы в этом отношении между Log4j2 API и SLF4J.

оба API требуют 2 зависимости при использовании собственной реализации и 4 зависимости для неродной реализации. SLF4J и Log4j2 API идентичны в этом отношении. Например:

Required dependencies are similar for SLF4J and the Log4j 2 API