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

У меня есть существующее приложение, которое выполняет все записи для 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 Loggers в классе JUL Logger. Это правильный подход?

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


person matt b    schedule 15.05.2009    source источник
comment
Для Log4j 2 см. stackoverflow.com/q/21781026   -  person Marcono1234    schedule 24.02.2021


Ответы (7)


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

person overthink    schedule 15.05.2009
comment
Хорошая ссылка, но я думаю, вы имели в виду # jul-to-slf4j - person araqnid; 15.05.2009
comment
Это звучит как хороший подход, за исключением того, что я не могу заставить его работать :( - person matt b; 15.05.2009
comment
Кроме того, я не могу поверить, что такая популярная библиотека, как ehcache, переключится на что-то вроде java.util.logging - кажется очень упрямым - person matt b; 15.05.2009
comment
Да, невероятно неприятно постоянно бороться с этим (ну, кажется, каждый раз, когда вы начинаете новый проект). Я не уверен в мотивации ehcache для перехода. Основное преимущество JUL, которое я вижу, заключается в том, что это не еще одна зависимость ... даже если это отстой :) - person overthink; 16.05.2009
comment
@matt b, JUL всегда присутствует в среде выполнения Java, поэтому он требует наименьших внешних зависимостей. Однако, на мой взгляд, это настоящий пример кода, написанного людьми, не имеющими опыта использования этого кода. Система настройки довольно неудобная. - person Thorbjørn Ravn Andersen; 20.06.2010
comment
Проблема в том, что если вы подключите SLF4J к JUL, производительность регистрации будет ужасной. В частности, каждая строка журнала, которую вы создаете, вызывает исключение, чтобы определить, какой контекст регистратора использовать. Это создает много накладных расходов и замедляет процессы - person Egwor; 08.12.2013

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

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

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

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

person Jim Ferrans    schedule 16.05.2009
comment
Сколько раз Ceki нужно было изобретать фреймворк / фасад журнала заново? - person mP.; 03.04.2010
comment
@mP: Возможно, ведение журнала не очень привлекательно, но это критически важная потребность для крупномасштабного программного обеспечения коммерческого уровня. SLF4J решает проблему интеграции кода, использующего разрозненные фреймворки журналирования (что стало еще более актуальным из-за того, что Sun выбрала разработку java.utils.logging вместо принятия Log4J). - person Jim Ferrans; 20.06.2010
comment
@mP, slf4j был необходим из-за плохой работы Sun с JUL. Logback - это форк log4j, а не новый проект. - person Thorbjørn Ravn Andersen; 20.06.2010
comment
Я обнаружил, что логбэк необходим, хотя бы потому, что это не Apache, и он действительно задокументирован. - person Spencer Kormos; 17.10.2011

Существует более простая альтернатива, чем 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-component
  3. пакет mvn
person Emmanuel Bourg    schedule 30.11.2010
comment
Я думаю, это проще, потому что это можно сделать, не меняя код, вам просто нужно добавить системное свойство. SLF4J пока не предлагает подобный механизм, вы либо меняете код, либо файл logging.properties. - person Emmanuel Bourg; 26.04.2013
comment
К сожалению, этого нет в log4j2 :( - person BeepDog; 30.09.2013
comment
ПРЕДУПРЕЖДЕНИЕ! jul-log4j-bridge использует никогда не выпускавшийся apache-log4j-companions пакет (бэкпорт из заброшенного log4j 1.3). Вам будет сложно его построить. Естественно, что и сам мост предрелизный. - person ivan_pozdeev; 29.07.2015
comment
@ivan_pozdeev Хорошее замечание, спасибо. Я добавил инструкции по его сборке. - person Emmanuel Bourg; 30.07.2015

ОКТЯБРЬ 2014

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

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

Класс LogManager

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

person AdrianRM    schedule 24.10.2014
comment
На данный момент (середина 2018 г.) это должен быть принятый ответ - person rmuller; 17.08.2018
comment
Для будущих читателей: я подтверждаю, что это работает. Итак, в основном (1) добавьте это в свой pom mvnrepository.com/artifact /org.apache.logging.log4j/log4j-jul и (2) добавьте системное свойство в первую ссылку (например, в параметрах JVM добавьте -Djava.util.logging.manager = org.apache.logging. log4j.jul.LogManager) - person Hossam El-Deen; 15.04.2020
comment
Я заметил, что наличие его в пути к классам - это не просто работа с вручную настроенной пружиной со встроенным tomcat 9.0. Можете ли вы предоставить шаги / код? оба регистратора работают, но tomcat, очевидно, не использует консольное приложение log4j по умолчанию. - person xenoterracide; 21.01.2021
comment
Самый большой недостаток заключается в том, что вам нужно настроить свойство System до того, как будут выполняться какие-либо вызовы LogManager или Logger (может быть причиной, почему это не работает для @xenoterracide). Особенно, когда ваш проект зависит от других проектов, это нелегко сделать разумным способом. Альтернативой может быть java.util.logging → SLF4J → Log4j 2. Вероятно, не очень производительно, но, по крайней мере, работает (с некоторыми ограничениями от моста SLF4J, поскольку он реализует только обработчик java.util.logging). - person Marcono1234; 24.02.2021
comment
Log4j 2 на самом деле имеет класс Log4jBridgeHandler, аналогичный классу SLF4J, но он еще не был перенесен на 2.x, см. запрос на перенос. - person Marcono1234; 27.02.2021

На сайте slf4j, как мне кажется, есть мост для передачи событий java.util.logging через slf4j (и, следовательно, на log4j).

Да, скачанный файл SLF4J содержит jul-to-slf4j, который, как мне кажется, делает именно это. Он содержит обработчик JUL для передачи записей в SLF4J.

person araqnid    schedule 15.05.2009

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

Однако в SLF4J он уже есть:

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

person Joshua Davis    schedule 21.06.2010

вы должны вручную добавить дуновение при запуске

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

демонстрация -> https://gist.github.com/jiahut/654eccd75a13b0a1c5d8f3b

person jiahut    schedule 09.08.2018