2009-05-15 7 views
82

J'ai une application existante qui fait toute sa journalisation contre log4j. Nous utilisons un certain nombre d'autres bibliothèques qui utilisent aussi log4j, ou se connectent à Commons Logging, qui finit par utiliser log4j sous les couvertures dans notre environnement. Une de nos dépendances se connecte même à slf4j, ce qui fonctionne également bien car il délègue finalement à log4j.Comment envoyer java.util.logging à log4j?

Maintenant, je voudrais ajouter ehcache à cette application pour certains besoins de mise en cache. Les versions précédentes d'ehcache utilisaient la consignation des journaux, ce qui aurait fonctionné parfaitement dans ce scénario, mais à partir de version 1.6-beta1, ils ont supprimé la dépendance sur la consignation des journaux et l'ont remplacé par java.util.logging à la place.

Ne connaissant pas vraiment la journalisation JDK intégrée disponible avec java.util.logging, existe-t-il un moyen facile d'envoyer les messages de journalisation à JUL connectés à log4j, afin de pouvoir utiliser ma configuration existante et configurer pour toute journalisation provenant d'ehcache?

En regardant les javadocs pour JUL il semble que je pourrais mettre en place un groupe de variables d'environnement pour changer ce qui LogManager la mise en œuvre est utilisée, et peut-être utiliser pour envelopper log4j Logger s dans la classe Logger juillet. Est-ce la bonne approche? Un peu ironique que l'utilisation d'une journalisation JDK intégrée par une bibliothèque causerait un tel mal de tête quand (la plupart) du reste du monde utilise des bibliothèques tierces à la place.

Répondre

36

Une approche que j'ai utilisée avec succès est d'utiliser slf4j comme API principale de journalisation. J'ai alors slf4j lié à log4j. Les dépendances tierces utilisant d'autres frameworks (comme JUL) peuvent être bridged à slf4j.

+2

Bonne liaison, mais je pense que vous vouliez dire # jul-à-slf4j – araqnid

+0

Bonne prise. J'ai mis à jour la réponse en conséquence. Merci! – overthink

+0

Cela semble être une bonne approche, sauf que je ne peux pas sembler le faire fonctionner :( –

3

Le site slf4j, je crois, a un pont pour passer des événements java.util.logging via slf4j (et donc log4j). Oui, le téléchargement SLF4J contient jul-to-slf4j qui, je crois, ne fait que cela. Il contient un gestionnaire JUL pour passer des enregistrements à SLF4J.

+0

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

18

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 un très bon travail. Dans notre code, nous utilisons directement les API de journalisation SLF4J et nous configurons SLF4J pour que les appels des API Jakarta Commons Logging (JCL), 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 la SLF4J, vous le configurez pour utiliser une implémentation de consignateur particulière. Il vient avec un enregistreur interne, ou "simple", et vous pouvez surcharger ceci avec Log4J, JUL, ou Logback. La configuration se fait simplement en déposant différents fichiers jar dans votre classpath.

À l'origine, nous avons utilisé l'implémentation de Logback, également écrite par Ceki Gülcü. C'est très puissant. Cependant, nous avons alors décidé de déployer notre application sur le serveur d'application Glassfish Java EE, dont l'afficheur 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 jars Logback par un pot SLF4J qui le relie à l'implémentation JUL.

Tout comme @overthink, je recommande chaudement d'utiliser SLF4J dans votre configuration.

+7

Combien de fois Ceki a-t-il besoin de réinventer un framework/fascade de journalisation? –

+0

@mP: La journalisation n'est peut-être pas glamour, mais c'est un besoin crucial pour les logiciels commerciaux de grande envergure. Et SLF4J résout le problème de l'intégration du code qui utilise des cadres de journalisation disparates (rendu plus urgent par Sun choisissant de développer java.utils.logging au lieu d'adopter Log4J). –

+3

@mP, slf4j était nécessaire car le mauvais travail que Sun a fait avec JUL. Le logback est une branche de log4j, pas un nouveau projet. –

2

@Yishai - Merci d'avoir posté le lien vers mon wiki. L'exemple là-bas redirige JUL vers Log4J et je l'ai fait tourner dans un système de production pendant quelques années. JBoss 5.x redirige déjà JUL vers Log4J, donc je l'ai retiré quand nous avons mis à jour.J'ai un nouveau qui redirige vers SLF4J, que j'utilise sur quelques choses maintenant. Je posterai ça quand j'aurai une chance.

Cependant, SLF4J a déjà:

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

12

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

Il vous suffit de mettre le jul-log4j-pont sur le chemin de classe et ajouter une propriété système:

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

jul-log4j-pont est pas Maven Central et peut b e extraite de ce référentiel:

<repository> 
    <id>psmith</id> 
    <url>http://people.apache.org/~psmith/logging.apache.org/repo</url> 
    <releases> 
    <enabled>false</enabled> 
    </releases> 
</repository> 

puis utilisé avec:

<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> 

Il est également possible de le reconstruire à partir des sources les étapes suivantes:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. edit pom.xml, remplace la dépendance sur log4j: log4j: 1.2.15 avec log4j: apache-log4j-extras: 1.2.17 et supprime la dépendance sur apache-log4j-compon ent
  3. package mvn
+0

Pas plus simple si vous utilisez déjà SLF4J. :) –

+3

Je pense que c'est plus simple car cela peut être fait sans changer de code, il suffit d'ajouter une propriété système. SLF4J ne propose pas encore de mécanisme similaire, vous pouvez soit changer le code soit le fichier 'logging.properties'. –

+1

Cela n'existe pas dans log4j2, malheureusement :( – BeepDog