Чи варто використовувати slf4j з log4j2


114

Я не в змозі вирішити, чи слід використовувати slf4j чи ні з log4j2. Виходячи з публікацій в Інтернеті, схоже, це не буде вражати ефективність, але чи справді це потрібно.

Також ці пункти правило на користь log4j2:

  • SLF4J змушує вашу програму реєструвати рядки. API Log4j 2 підтримує реєстрацію будь-якого CharSequence, якщо ви хочете ввести текст, але також підтримує журнал будь-якого Об'єкта таким, яким він є.
  • API Log4j 2 пропонує підтримку для реєстрації об’єктів повідомлення, виразів лямбда Java 8 та безметкового ведення журналу (це дозволяє уникнути створення масивів vararg та уникає створення рядків під час реєстрації об’єктів CharSequence).

2
Може бути. Що робити, якщо мій сервер додатків включає в себе slf4jі реєстрацію (або log4jv1)? Чи потрібно мені потім змусити встановити третій реєстратор, щоб використовувати ваш додаток? А може корпоративна безпека вирішує, що ви можете використовувати лише java.util.loggingу виробництві, що тоді?
Елліот Фріш

Дякую за написання. Але, якщо кожен використовує log4j org wide, наведений вище аргумент не вважатиметься дійсним.
Andy897

4
Використання SLF4J означає, що замінити реалізацію дуже легко, якщо зміниться політика компанії, наприклад, коли ваша компанія придбана та нові політики вимушені на вас. Використання SLF4J зараз, коли ви пишете код, займе не більше часу, ніж безпосередньо використання Log4j. Заміна прямих дзвінків Log4j пізніше потребуватиме багато часу. SLF4J - це безкоштовна інвестиція / страхування на майбутнє. Це важливіше, ніж функції API Log4j 2? Тільки ви (або політика компанії) можете вирішити це.
Андреас

Чи є навіть спосіб використовувати slf4j з log4j2, якщо ви цього хотіли? На цій сторінці показано використання з log4j - версії 1.2, що закінчується терміном життя), але для log4j2 немає жодної опції. Якщо є спосіб, чому slf4j не згадує про це?
J Woodchuck

Відповіді:


162

Вперед: програмуйте на log4j2 API замість slf4j

Це безпечно: API Log4j2 пропонує точно такі ж гарантії, що і 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 повідомлення
  • Лямбди для ледачих лісозаготівель
  • Введіть будь-який об’єкт, а не лише рядки
  • Без сміття: уникайте створення вараг або створення рядків, де це можливо
  • CloseableThreadContext автоматично видаляє елементи з MDC, коли ви закінчите з ними

(Докладніше див. 10 функцій API Log4j2, недоступних у SLF4J .)

Програми можуть безпечно використовувати ці багатофункціональні можливості Log4j2 API, не замикаючись на початковій реалізації ядра Log4j2.

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


Розкриття інформації: Я вношу свій внесок у Log4j2.


Оновлення: Мабуть, існує деяка плутанина, що програмування до Log4j2 API якимось чином вводить "фасад для фасаду". У цьому відношенні між API Log4j2 та SLF4J немає різниці.

Обидва API вимагають 2 залежності при використанні нативного втілення та 4 залежності для ненормативної реалізації. У цьому відношенні SLF4J та API Log4j2 однакові. Наприклад:

Необхідні залежності схожі для SLF4J та API Log4j 2


7
Я розумію. Дозвольте перефразувати своє запитання. Чи є якісь незалежні реалізації API log4j2, крім log4j2?
Чекі

5
API Log4j2 та impl не "щільно з'єднані". Всі ці реалізації SLF4J доступні: Додаток, кодований проти Log4j2 API, може вибрати log4j-to-slf4jзалежність замість log4j-coreі вибрати будь-яку з цих згаданих вами реалізацій SLF4J. Кількість нативної реалізації API Log4j2 не має значення.
Ремко Попма

19
Проблема полягає в тому, що ви часто маєте залежність від бібліотек, які самі використовують slf4j, тому простіше просто дотримуватися цього.
Давіо

18
Отже, я повинен використовувати інтерфейс для інтерфейсу для реалізації? Так, ні, дякую ... Slf4j обіграв log4j на удар, забезпечивши хороший інтерфейс для реалізації для ведення журналів ... log4j2 повинен просто реалізувати slf4j api - якщо є відсутність функції, внесіть її назад, якщо slf4j не прийме нову функція, то МОЖЕТЕ є випадок інтерфейсів api для log4j2 ....
RockMeetHardplace

4
@RemkoPopma - ти все ще виступаєш проти використання інтерфейсу log4j. Так, я розумію - я можу зв'язати інтерфейс log4j2 -> інтерфейс slf4j -> будь-яку реалізацію, але я просто скоріше не абстрагую абстракцію - дякую, але не дякую.
RockMeetHardplace
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.