2009-05-15 4 views
82

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

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

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

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

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

ответ

36

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

+2

Хорошая ссылка, но я думаю, что вы имели в виду # июля-к-SLF4J – araqnid

+0

хорошего улова. Я соответствующим образом обновил ответ. Благодаря! – overthink

+0

Это похоже на хороший подход, за исключением того, что я не могу заставить его работать :( –

3

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

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

+0

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

18

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

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

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

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

+7

Сколько раз Ceki нужно изобретать фреймворк регистрации? –

+0

@mP: регистрация не может быть гламурной, но это крайне необходимо для крупномасштабного коммерческого программного обеспечения. И SLF4J решает проблему интеграции кода, который использует разрозненные фреймворки протоколирования (более срочно, когда Sun выбирает разработку java.utils.logging вместо принятия Log4J). –

+3

@ mP, slf4j было необходимо, потому что плохая работа Sun сделала с JUL. Logback - это fork log4j, а не новый проект. –

2

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

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

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

12

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

Вы просто должны поставить Юля-log4j-мост на пути к классам и добавить свойство системы:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager 

июлю-log4j-мост не в Maven Центральной и может б е выбираются из этого хранилища:

<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. СВН совместно 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. МВН пакет
+0

Не проще, если вы уже используете SLF4J. :) –

+3

Я думаю, что это проще, потому что это можно сделать без изменения кода, вам просто нужно добавить системное свойство. SLF4J пока не предлагает аналогичный механизм, вы либо меняете код, либо файл 'logging.properties'. –

+1

Этого не существует в log4j2, к сожалению :( – BeepDog

5

октября 2014

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

JDK Logging Adapter

Class LogManager

Migrate from log4j 1.x to log4j 2

+0

Миграция так сложно, хотя ... – Trejkaz