Comment envoyer java.util.logging à log4j?

J’ai une application existante qui effectue toute la journalisation contre log4j. Nous utilisons plusieurs autres bibliothèques qui utilisent également log4j ou se connectent à Commons Logging, qui finit par utiliser log4j sous les couvertures de notre environnement. Une de nos dépendances se connecte même à slf4j, ce qui fonctionne également bien car elle délègue également à log4j.

Maintenant, j’aimerais append ehcache à cette application pour certains besoins de mise en cache. Les versions précédentes de ehcache utilisaient la journalisation des commons, ce qui aurait parfaitement fonctionné dans ce scénario, mais à partir de la version 1.6-beta1, elles ont supprimé la dépendance à la journalisation des commons et l’ont remplacée par java.util.logging.

Ne connaissant pas vraiment la journalisation JDK intégrée disponible avec java.util.logging, existe-t-il un moyen simple d’envoyer des messages de journalisation à JUL consignés dans log4j, afin que je puisse utiliser ma configuration existante et configurer la journalisation à venir? de ehcache?

En regardant les javadocs pour JUL, il semble que je puisse configurer un ensemble de variables d’environnement pour changer l’implémentation de LogManager , et peut-être l’utiliser pour envelopper log4j Logger dans la classe JUL Logger . Est-ce la bonne approche?

Un peu ironique de constater que l’utilisation de la journalisation JDK intégrée par une bibliothèque serait un casse-tête quand le rest du monde utilise plutôt des bibliothèques tierces.

L’une des approches que j’ai utilisées avec succès consiste à utiliser slf4j en tant qu’API de journalisation principale. J’ai alors slf4j lié à log4j. Les dépendances tierces utilisant d’autres frameworks (comme JUL) peuvent être reliées à slf4j.

Nous utilisons SLF4J sur notre projet actuel et cela a très bien fonctionné pour nous. SLF4J est écrit par Ceki Gülcü, le créateur de Log4J, et il a fait du très bon travail. Dans notre code, nous utilisons directement les API de journalisation SLF4J, et nous configurons SLF4J de sorte que les appels provenant des API JCL ( Jakarta Commons Logging ), Java.util.logging (JUL) et Log4J soient tous reliés aux API SLF4J. Nous devons le faire car, comme vous, nous utilisons des bibliothèques tierces (open source) qui ont choisi différentes API de journalisation.

Au bas de SLF4J, vous le configurez pour utiliser une implémentation particulière de l’enregistreur. Il est fourni avec un enregistreur interne ou «simple» et vous pouvez le remplacer par Log4J, JUL ou Logback . La configuration se fait tout simplement en déposant différents fichiers jar dans votre chemin de classe.

À l’origine, nous avons utilisé l’implémentation Logback, également écrite par Ceki Gülcü. C’est très puissant. Cependant, nous avons ensuite décidé de déployer notre application sur le serveur d’applications Glassfish Java EE, dont la visionneuse de journal attend des messages au format JUL. Donc, aujourd’hui, je suis passé de Logback à JUL, et en quelques minutes, j’ai remplacé deux bocaux Logback par un jar SLF4J qui le connecte à l’implémentation JUL.

Donc, comme @overthink, je vous recommande vivement d’utiliser SLF4J dans votre configuration.

Il existe une alternative plus simple que SLF4J pour ponter JUL avec log4j, voir http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Il vous suffit de placer le pont jul-log4j sur le classpath et d’append une propriété système:

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

jul-log4j-bridge n’est pas dans Maven Central et peut être récupéré depuis ce repository:

  psmith http://people.apache.org/~psmith/logging.apache.org/repo  false   

et ensuite utilisé avec:

  org.apache.logging apache-jul-log4j-bridge 1.0.0-SNAPSHOT test   log4j apache-log4j-component    

Il est également possible de le reconstruire à partir des sources en procédant comme suit:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. éditez pom.xml, remplacez la dépendance sur log4j: log4j: 1.2.15 par log4j: apache-log4j-extras: 1.2.17 et supprimez la dépendance sur apache-log4j-component
  3. paquet mvn

OCTOBRE 2014

Depuis la version 2.1 de log4j existe le composant log4j-jul, qui permet exactement cela. Cependant, si vous utilisez log4j 1, vous devez pouvoir passer à log4j2 pour pouvoir utiliser cette approche.

JDK Logging Adapter

Class LogManager

Migrer de log4j 1.x à log4j 2

Je crois que le site slf4j a un pont pour passer des événements java.util.logging via slf4j (et donc log4j).

Oui, le téléchargement de SLF4J contient jul-to-slf4j, ce que je pense. Il contient un gestionnaire JUL pour transmettre les enregistrements à SLF4J.

@Yishai – Merci d’avoir posté le lien vers mon wiki. L’exemple ici redirige JUL vers Log4J et je l’exploite depuis quelques années dans un système de production. JBoss 5.x redirige déjà JUL vers Log4J, alors je l’ai sorti quand nous avons mis à jour. J’ai un plus récent qui redirige vers SLF4J, que j’utilise sur quelques points maintenant. Je posterai ça quand j’aurai une chance.

Cependant, SLF4J l’a déjà:

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

vous devriez append manuellement un son au démarrage

 SLF4JBridgeHandler.removeHandlersForRootLogger() SLF4JBridgeHandler.install() 

démo -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d