it-swarm.com.de

Wie sendet man Java.util.logging an log4j?

Ich habe eine vorhandene Anwendung, die alle Protokollierungen gegen log4j ausführt. Wir verwenden eine Reihe anderer Bibliotheken, die entweder log4j verwenden oder sich gegen Commons Logging anmelden, was schließlich unter Verwendung von log4j in unserer Umgebung verwendet wird. Eine unserer Abhängigkeiten protokolliert sogar gegen slf4j, was ebenfalls gut funktioniert, da es letztendlich auch an log4j delegiert.

Jetzt möchte ich dieser Anwendung für einige Caching-Anforderungen ehcache hinzufügen. Frühere Versionen von ehcache verwendeten Commons-Logging, was in diesem Szenario einwandfrei funktioniert hätte. Ab Version 1.6-beta1 haben sie jedoch die Abhängigkeit von Commons-Logging entfernt und stattdessen durch Java.util.logging ersetzt.

Da ich mit der integrierten JDK-Protokollierung, die mit Java.util.logging verfügbar ist, nicht wirklich vertraut ist, gibt es eine einfache Möglichkeit, Protokollnachrichten an JUL für log4j zu protokollieren, sodass ich meine vorhandene Konfiguration verwenden und die Protokollierung einrichten kann von ehcache?

Wenn ich mir die Javadocs für JUL anschaue, sieht es so aus, als könnte ich eine Reihe von Umgebungsvariablen einrichten, um zu ändern, welche LogManager-Implementierung verwendet wird, und dies möglicherweise verwenden, um log4j Loggers in die JUL-Klasse Logger zu packen. Ist das der richtige Ansatz?

Ein bisschen ironisch, dass die Verwendung einer integrierten JDK-Protokollierung in einer Bibliothek solche Kopfschmerzen verursachen würde, wenn (der größte Teil der Welt) stattdessen Bibliotheken von Drittanbietern verwendet.

83
matt b

Ein Ansatz, den ich erfolgreich eingesetzt habe, ist die Verwendung von slf4j als primäre Protokollierungs-API. Ich habe dann slf4j an log4j binden. Abhängigkeiten von Drittanbietern, die andere Frameworks (wie JUL) verwenden, können überbrückt an slf4j sein.

36
overthink

Wir verwenden SLF4J für unser aktuelles Projekt und es hat sehr gut für uns funktioniert. SLF4J wurde von Ceki Gülcü, dem Erfinder von Log4J, geschrieben und hat wirklich gute Arbeit geleistet. In unserem Code verwenden wir die SLF4J-Protokollierungs-APIs direkt und konfigurieren SLF4J so, dass Aufrufe der APIs Jakarta Commons Logging (JCL), Java.util.logging (JUL) und Log4J gebrückt werden zu den SLF4J-APIs. Wir müssen das tun, da wir wie Sie Bibliotheken von Drittanbietern (Open Source) verwenden, die unterschiedliche Protokollierungs-APIs ausgewählt haben.

Im unteren Bereich von SLF4J konfigurieren Sie es für die Verwendung einer bestimmten Loggerimplementierung. Es wird mit einem internen oder "einfachen" Logger geliefert, den Sie mit Log4J, JUL oder Logback überschreiben können. Die Konfiguration erfolgt einfach durch Ablegen in verschiedenen JAR-Dateien in Ihrem Klassenpfad.

Ursprünglich haben wir die Logback-Implementierung verwendet, die ebenfalls von Ceki Gülcü geschrieben wurde. Das ist sehr mächtig. Wir haben uns jedoch entschlossen, unsere Anwendung auf dem Glassfish Java EE-Anwendungsserver bereitzustellen, dessen Protokollbetrachter JUL-formatierte Nachrichten erwartet. Heute habe ich also von Logback zu JUL gewechselt und in wenigen Minuten habe ich zwei Logback-Gläser durch ein SLF4J-Glas ersetzt, das es mit der JUL-Implementierung verbindet.

Wie @overthink würde ich SLF4J in Ihrem Setup wärmstens empfehlen.

19
Jim Ferrans

Es gibt eine einfachere Alternative als SLF4J, JUL mit log4j zu überbrücken, siehe http://people.Apache.org/~psmith/logging.Apache.org/sandbox/jul-log4j-bridge/examples.html

Sie müssen nur die jul-log4j-bridge auf den Klassenpfad setzen und eine Systemeigenschaft hinzufügen:

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

jul-log4j-bridge befindet sich nicht in Maven Central und kann von diesem Repository abgerufen werden:

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

und dann verwendet mit:

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

Es ist auch möglich, es mit den folgenden Schritten aus Quellen neu aufzubauen:

  1. svn co http://svn.Apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. bearbeiten Sie pom.xml, ersetzen Sie die Abhängigkeit von log4j: log4j: 1.2.15 mit log4j: Apache-log4j-extras: 1.2.17 und entfernen Sie die Abhängigkeit von der Apache-log4j-Komponente
  3. mVN-Paket
12
Emmanuel Bourg

OKTOBER 2014

Seit Version 2.1 von log4j existiert die Komponente log4j-jul, was genau dies erlaubt. Falls Sie log4j 1 verwenden, muss jedoch ein Upgrade auf log4j2 möglich sein, um diesen Ansatz verwenden zu können.

JDK-Protokollierungsadapter

Class LogManager

Migration von log4j 1.x zu log4j 2

6
AdrianRM

Die slf4j-Site hat meines Erachtens eine Brücke zum Übergeben von Java.util.logging-Ereignissen über slf4j (und damit an log4j).

Ja, der SLF4J-Download enthält jul-to-slf4j, von dem ich glaube, dass er genau das tut. Es enthält einen JUL-Handler, um Datensätze an SLF4J zu übergeben.

3
araqnid

@ Yishai - Danke, dass du den Link in mein Wiki gestellt hast. Das Beispiel leitet JUL auf Log4J um, und ich hatte es bereits seit einigen Jahren in einem Produktionssystem. JBoss 5.x leitet JUL bereits zu Log4J um, daher habe ich es beim Upgrade herausgenommen. Ich habe eine neuere Version, die auf SLF4J umleitet, was ich jetzt für ein paar Dinge verwende. Ich werde das posten, wenn ich eine Chance habe. 

SLF4J hat es jedoch bereits:

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

2
Joshua Davis

sie sollten beim Start manuell ein Nachlauf hinzufügen

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

demo -> https://Gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

0
jiahut