Как отправить java.утиль.вход в log4j?


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

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

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

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

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

7 82

7 ответов:

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

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

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

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

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

существует более простая альтернатива, чем SLF4J для моста JUL с log4j, см. http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

вы просто должны поставить Jul-log4j-bridge на classpath и добавить системное свойство:

-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. edit pom.XML-файле, заменить зависимость к log4j:настройки log4j:1.2.15 с настройки log4j:Апач-к log4j-дополнительно:1.2.17 и удалить зависимость на Apache-настройки log4j-компонент
  3. mvn пакет

октябрь 2014

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

JDK Logging Adapter

Класс LogManager

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

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

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

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

однако, SLF4J уже имеет это:

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

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

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

demo ->https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d