Как отправить java.util.logging в log4j? - PullRequest
83 голосов
/ 15 мая 2009

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

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

Ответы [ 7 ]

36 голосов
/ 15 мая 2009

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

19 голосов
/ 16 мая 2009

Мы используем 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, также написанную Ceki Gülcü. Это очень сильно. Однако затем мы решили развернуть наше приложение на сервере приложений Glassfish Java EE, чья программа просмотра журналов ожидает сообщения в формате JUL. Итак, сегодня я переключился с Logback на JUL, и всего за несколько минут я заменил два Logback-контейнера на SLF4J, который соединяет его с реализацией JUL.

Так же, как @overthink, я бы искренне рекомендовал использовать SLF4J в вашей настройке.

12 голосов
/ 01 декабря 2010

Существует более простая альтернатива, чем 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. мвн пакет
7 голосов
/ 24 октября 2014

ОКТЯБРЬ 2014

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

Адаптер JDK

Класс LogManager

Миграция из log4j 1.x в log4j 2

3 голосов
/ 15 мая 2009

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

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

2 голосов
/ 21 июня 2010

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

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

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

0 голосов
/ 09 августа 2018

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

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

демо -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

...