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

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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Также можно перестроить его из источников со следующими шагами:

Ответ 4

ОКТЯБРЬ 2014

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

JDK Logging Adapter

Class LogManager

Перенести с log4j 1.x на log4j 2

Ответ 5

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

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

Ответ 6

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

Однако SLF4J уже имеет его:

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