Как отправить java.util.logging в log4j?

84

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

Теперь я хотел бы добавить в это приложение ehcache для некоторых нужд кеширования. Предыдущие версии ehcache использовали ведение журнала общего доступа, которое отлично работало бы в этом сценарии, но начиная с версии 1.6-beta1 они удалили зависимость от ведения журнала общего пользования и заменили его на java.util.logging.

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

Глядя на javadocs для JUL, похоже, что я мог бы настроить кучу переменных среды, чтобы изменить LogManagerиспользуемую реализацию, и, возможно, использовать это для обертывания log4j Loggerв Loggerклассе JUL . Это правильный подход?

Какая-то ирония в том, что использование библиотекой встроенного журналирования JDK вызовет такую ​​головную боль, когда (большая часть) остальной мир вместо этого использует сторонние библиотеки.

Мэтт Би
источник

Ответы:

37

Один из подходов, которые я успешно использовал, - это использовать slf4j в качестве основного API ведения журналов. Затем я привязываю slf4j к log4j. Зависимости партии 3 - го с помощью других механизмов (как JUL) может быть мостиком к SLF4J.

слишком много думать
источник
2
Хорошая ссылка, но я думаю, вы имели в виду # jul-to-slf4j
araqnid
Это звучит как хороший подход, за исключением того, что я не могу заставить его работать :(
matt b
2
Кроме того, я не могу поверить, что такая популярная библиотека, как ehcache, переключится на что-то вроде java.util.logging - кажется очень упрямым
matt b
1
@matt b, JUL всегда присутствует в среде выполнения Java, поэтому он требует наименьших внешних зависимостей. Однако, на мой взгляд, это настоящий пример кода, написанного людьми, не имеющими опыта использования этого кода. Система настройки довольно неудобная.
Thorbjørn Ravn Andersen
1
Проблема в том, что если вы подключите SLF4J к JUL, производительность журналирования будет ужасной. В частности, каждая строка журнала, которую вы создаете, вызывает исключение, чтобы определить, какой контекст регистратора использовать. Это создает много накладных расходов и замедляет процессы
Эгвор
19

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

В нижней части SLF4J вы настраиваете его для использования определенной реализации регистратора. Он поставляется с внутренним или «простым» регистратором, и вы можете изменить его с помощью Log4J, JUL или Logback . Конфигурация выполняется просто путем добавления разных файлов jar в путь к классам.

Первоначально мы использовали реализацию Logback, также написанную Цеки Гюльджю. Это очень мощно. Однако затем мы решили развернуть наше приложение на сервере приложений Java EE Glassfish, средство просмотра журналов которого ожидает сообщения в формате JUL. Итак, сегодня я переключился с Logback на JUL, и всего за несколько минут я заменил две баночки Logback на банку SLF4J, которая соединяет его с реализацией JUL.

Как и @overthink, я настоятельно рекомендую использовать SLF4J в вашей настройке.

Джим Ферранс
источник
8
Сколько раз Ceki нужно было заново изобретать фреймворк / фасад регистрации?
М.П.
@mP: Возможно, ведение журнала не очень привлекательно, но это критическая потребность для крупномасштабного программного обеспечения коммерческого уровня. SLF4J решает проблему интеграции кода, использующего разнородные фреймворки для ведения журналов (что стало еще более актуальным из-за того, что Sun выбрала разработку java.utils.logging вместо принятия Log4J).
Джим Ферранс,
3
@mP, slf4j был необходим из-за плохой работы Sun с JUL. Logback - это форк log4j, а не новый проект.
Thorbjørn Ravn Andersen
3
Я обнаружил, что логбэк необходим, хотя бы потому, что это не Apache, и он действительно задокументирован.
Спенсер Кормос
13

Существует более простая альтернатива , чем SLF4J преодолеть Юля с 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-component
  3. mvn пакет
Эммануэль Бур
источник
4
Я думаю, это проще, потому что это можно сделать, не меняя код, вам просто нужно добавить системное свойство. SLF4J пока не предлагает подобный механизм, вы либо меняете код, либо logging.propertiesфайл.
Эммануэль Бург,
1
К сожалению, этого не существует в log4j2 :(
BeepDog
JulLog4jBridge.assimilate();o_0
Bastian Voigt
2
ПРЕДУПРЕЖДЕНИЕ! jul-log4j-bridgeиспользует никогда не выпущенный apache-log4j-companionsкомплект (бэкпорт из заброшенного log4j 1.3). Вам будет сложно его построить. Естественно, что сам мост тоже заброшен до релиза.
ivan_pozdeev
@ivan_pozdeev Хорошее замечание, спасибо. Я добавил инструкции по его сборке.
Emmanuel Bourg
9

ОКТЯБРЬ 2014

Начиная с версии 2.1 log4j существует компонент log4j-jul, который позволяет именно это. Тем не менее, если вы используете log4j 1, должна быть возможность обновления до log4j2, чтобы использовать этот подход.

Адаптер журналирования JDK

Класс LogManager

Переход с log4j 1.x на log4j 2

AdrianRM
источник
2
На данный момент (середина 2018 г.) это должен быть принятый ответ
Рмюллер
Для будущих читателей: я подтверждаю, что это работает. Итак, в основном (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

Джошуа Дэвис
источник