web-dev-qa-db-fra.com

Comment envoyer Java.util.logging à log4j?

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

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

N'étant pas vraiment familiarisé avec la journalisation JDK intégrée disponible avec Java.util.logging, existe-t-il un moyen simple de faire en sorte que les messages de journal envoyés à JUL soient journalisés contre log4j, afin que je puisse utiliser ma configuration existante et configurer celle-ci de ehcache?

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

C'est un peu ironique de constater que l'utilisation par une bibliothèque de la journalisation JDK intégrée causerait un tel mal à la tête lorsque (la majeure partie) le monde utilise des bibliothèques tierces.

83
matt b

Une approche que j'ai utilisée avec succès consiste à utiliser slf4j en tant que mon API de journalisation principale. J'ai alors slf4j lié à log4j. Les dépendances de tiers utilisant d'autres frameworks (comme JUL) peuvent être pontées vers slf4j.

36
overthink

Nous utilisons SLF4J sur notre projet actuel et cela a très bien fonctionné pour nous. SLF4J a été écrit par Ceki Gülcü, le créateur de Log4J, et il a vraiment fait du bon travail. Dans notre code, nous utilisons directement les API de journalisation SLF4J et nous configurons SLF4J de sorte que les appels des Jakarta Commons Logging (JCL), Java.util.logging (JUL) et Log4J API soient tous ponté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 de consignateur particulière. Il vient avec un logger interne, ou "simple", et vous pouvez le remplacer par Log4J, JUL ou Logback . La configuration se fait simplement en déposant différents fichiers JAR dans votre classpath.

À l'origine, nous utilisions 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 l'observateur de journal attend des messages au format JUL. Donc, aujourd’hui, j’ai changé de Logback à JUL et, en quelques minutes, j’ai remplacé deux fichiers jar Logback par un fichier jar SLF4J qui le connecte à l’implémentation JUL.

Donc, comme @overthink, je recommanderais vivement d'utiliser SLF4J dans votre configuration.

19
Jim Ferrans

Il existe une alternative plus simple que SLF4J pour relier JUL à 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 chemin de classe et d'ajouter 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 référentiel:

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

et ensuite 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 de 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-composant
  3. paquet mvn
12
Emmanuel Bourg

Octobre 2014

Depuis la version 2.1 de log4j, le composant log4j-jul existe, ce qui permet cela. Néanmoins, si vous utilisez log4j 1, il doit être possible de passer à log4j2 pour pouvoir utiliser cette approche.

Adaptateur d'enregistrement JDK

Class LogManager

Migrer de log4j 1.x vers log4j 2

6
AdrianRM

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

Oui, le téléchargement de SLF4J contient jul-to-slf4j, ce qui, je crois, en est une. Il contient un gestionnaire JUL pour transmettre les enregistrements à SLF4J.

3
araqnid

@Yishai - Merci d'avoir posté le lien sur mon wiki. L'exemple ci-dessous redirige JUL vers Log4J et je le fais fonctionner dans un système de production depuis quelques années. JBoss 5.x redirige déjà JUL vers Log4J, je l'ai donc retiré lors de la mise à niveau. J'ai un plus récent qui redirige vers SLF4J, que j'utilise maintenant sur quelques petites choses. Je posterai ça quand j'en aurai l'occasion. 

Cependant, SLF4J l'a déjà:

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

2
Joshua Davis

vous devez ajouter manuellement Blow au démarrage

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

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

0
jiahut