Як надіслати java.util.logging до log4j?


84

У мене є існуюча програма, яка робить усі свої журнали щодо log4j. Ми використовуємо ряд інших бібліотек, які також використовують log4j, або входять до журналу Commons Logging, що в кінцевому підсумку використовує log4j під обкладинками в нашому середовищі. Одна з наших залежностей навіть реєструється проти slf4j, що також чудово працює, оскільки врешті-решт також делегує log4j.

Тепер я хотів би додати ehcache до цієї програми для деяких потреб кешування. Попередні версії ehcache використовували commons-logging, які в цьому сценарії працювали б ідеально, але станом на версію 1.6-beta1 вони видалили залежність від commons-logging і замінили його на java.util.logging.

Насправді не знаючи вбудованого журналювання JDK, доступного за допомогою java.util.logging, чи є простий спосіб, щоб будь-які повідомлення журналу, надіслані в JUL, реєструвались у log4j, тому я можу використовувати свою існуючу конфігурацію та налаштовувати на будь-які журнали з ehcache?

Переглядаючи javadocs для JUL, схоже, я міг би встановити купу змінних середовища, щоб змінити, яка LogManagerреалізація використовується, і, можливо, використовувати це для обгортання log4j Loggers у Loggerкласі JUL . Це правильний підхід?

Іронічно, що використання бібліотекою вбудованих журналів JDK може спричинити такий головний біль, коли (більшість) решти світу використовує замість цього сторонні бібліотеки.

Відповіді:


37

Одним із підходів, який я успішно використав, є використання slf4j як мого основного API ведення журналу. Потім у мене slf4j прив'язується до log4j. Залежно партії 3 - го з допомогою інших механізмів (як JUL) може бути містком до SLF4J.


2
Гарне посилання, але, думаю, ви мали на увазі # лип-до-slf4j
araqnid

Це звучить як хороший підхід, за винятком того, що я, здається, не можу змусити його працювати :(
matt b

2
Крім того, я не можу повірити, що така популярна бібліотека, як ehcache, зможе перейти на щось на зразок java.util.logging - здається дуже непорочним
matt

1
@matt b, JUL присутній у середовищі виконання Java завжди, тому вимагає найменших зовнішніх залежностей. Однак, на мої очі, це справжній приклад коду, написаного людьми, які не мають досвіду використання цього коду. Система конфігурації досить незручна.
Thorbjørn Ravn Andersen

1
Проблема у вас полягає в тому, що якщо ви мостуєте SLF4J до JUL, ефективність ведення журналу жахлива. Зокрема, кожен створений вами рядок журналу призводить до викиду, який визначає контекст реєстратора. Це створює багато накладних витрат і уповільнює процеси
Egwor,

19

Ми використовуємо SLF4J для нашого поточного проекту, і він дуже добре для нас працював. SLF4J написаний Ceki Gülcü, творцем Log4J, і він зробив справді чудову роботу. У нашому коді ми використовуємо API реєстрації SLF4J безпосередньо, і ми налаштовуємо SLF4J так, щоб дзвінки з журналу Commons Logging (JCL), java.util.logging (JUL) та Log4J API були пов’язані з API SLF4J. Нам потрібно це зробити, тому що, як і ви, ми використовуємо сторонні бібліотеки (з відкритим кодом), які вибрали різні API реєстрації.

У нижній частині SLF4J ви налаштовуєте його на використання конкретної реалізації реєстратора. Він поставляється з внутрішнім або "простим" реєстратором, і ви можете замінити його за допомогою Log4J, JUL або Logback . Налаштування виконується просто шляхом скидання різних файлів jar у шлях до вашого класу.

Спочатку ми використовували реалізацію Logback, також написану Ceki Gülcü. Це дуже потужно. Однак ми вирішили розгорнути наш додаток на сервері додатків Glassfish Java EE, переглядач журналів якого очікує повідомлення у форматі JUL. Тож сьогодні я перейшов з Logback на JUL, і буквально за кілька хвилин замінив два банки Logback на jar SLF4J, який підключає його до реалізації JUL.

Тож, як @overthink, я щиро рекомендую використовувати SLF4J у налаштуваннях.


8
Скільки разів потрібно Ceki, щоб винаходити каркас / фасад журналювання?
мП.

@mP: Ведення журналу може бути не гламурним, але це надзвичайно важлива потреба у великомасштабному комерційному програмному забезпеченні. І SLF4J вирішує проблему інтеграції коду, який використовує різні механізми ведення журналу (що стало більш актуальним, коли Sun вирішив розробити java.utils.logging замість того, щоб прийняти Log4J).
Джим Ферранс,

3
@mP, slf4j був необхідний, оскільки Сун зробив погану роботу з JUL. Logback - це вилка log4j, а не новий проект.
Thorbjørn Ravn Andersen

3
Я виявив необхідність реєстрації, якщо ні для чого іншого, це не Apache, і насправді це задокументовано.
Спенсер Кормос

13

Існує простіша альтернатива, ніж SLF4J, пов’язати JUL з log4j, див. Http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Вам просто потрібно розмістити jul-log4j-bridge на шляху до класу та додати системну властивість:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

jul-log4j-bridge не знаходиться у Maven Central, і його можна отримати з цього сховища:

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

а потім використовується з:

<dependency>
  <groupId>org.apache.logging</groupId>
  <artifactId>apache-jul-log4j-bridge</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>apache-log4j-component</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Також можна відновити його з джерел, виконавши такі дії:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. відредагуйте pom.xml, замініть залежність від log4j: log4j: 1.2.15 на log4j: apache-log4j-extras: 1.2.17 та видаліть залежність від apache-log4j-компонента
  3. пакет mvn

4
Я думаю, що це простіше, тому що це можна зробити без зміни коду, вам просто потрібно додати системну властивість. SLF4J ще не пропонує подібний механізм, ви або змінюєте код, або logging.propertiesфайл.
Еммануель Бурґ

1
Це не існує в log4j2, на жаль :(
BeepDog

JulLog4jBridge.assimilate();o_0
Бастіан Фойгт

2
УВАГА! jul-log4j-bridgeвикористовує ніколи не випущений apache-log4j-companionsпакет (бекпорт із покинутих log4j 1.3). Вам важко буде його побудувати. Природно, що від самого мосту теж покинули попередній випуск.
ivan_pozdeev

@ivan_pozdeev Гарна думка, дякую. Я додав інструкції щодо його створення.
Еммануель Бур

9

ЖОВТЕНЬ 2014

З версії 2.1 log4j існує компонент log4j-jul, який дозволяє саме це. Тим не менше, якщо ви використовуєте log4j 1, для використання цього підходу повинна бути можливість оновлення до log4j2.

Адаптер реєстрації JDK

Клас LogManager

Перехід з log4j 1.x на log4j 2


2
На даний момент (середина 2018 року) це має бути прийнятою відповіддю
rmuller

Для майбутніх читачів: я підтверджую, що це працює. Отже, в основному (1) додайте це у свій pom mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jul та (2) додайте системну властивість у першому посиланні (наприклад, у параметрах JVM додайте -Djava. util.logging.manager = org.apache.logging.log4j.jul.LogManager)
Хоссам Ель-Дін

3

Сайт slf4j, на мою думку, має міст для передачі подій java.util.logging через slf4j (а отже, і log4j).

Так, завантаження SLF4J містить jul-to-slf4j, який, на мою думку, робить саме це. Він містить обробник JUL для передачі записів у SLF4J.


2

@Yishai - Дякуємо за розміщення посилання на мою вікі. Приклад там перенаправляє JUL на Log4J, і я працював у виробничій системі протягом декількох років. JBoss 5.x вже перенаправляє JUL на Log4J, тому я вийняв його, коли ми оновили. У мене є новий, який переспрямовує на SLF4J, який я використовую зараз для кількох речей. Я опублікую це, коли отримаю можливість.

Однак у SLF4J це вже є:

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.