Frage

Ich habe eine vorhandene Anwendung, die alle seine Protokollierung gegen log4j tut. Wir verwenden eine Reihe von anderen Bibliotheken, die entweder auch log4j verwenden, oder melden Sie sich gegen Commons Logging, die log4j unter der Decke in unserer Umwelt mit endet. Einer unserer Abhängigkeiten meldet auch gegen slf4j, was auch gut funktioniert, da es schließlich die Delegierten auch auf LOG4J.

Nun, ich möchte ehcache für einige Caching-Anforderungen dieser Anwendung hinzuzufügen. Frühere Versionen von ehcache verwendet commons-logging, die sich perfekt in diesem Szenario funktioniert hätte, aber von Version 1.6-beta1 sie die Abhängigkeit von commons-logging entfernt und ersetzt es mit java.util.logging statt.

ist nicht wirklich vertraut mit dem eingebauten in JDK Logging mit java.util.logging verfügbar, gibt es eine einfache Möglichkeit, alle Log-Meldungen Juli gegen log4j angemeldet geschickt haben, so kann ich meine bestehende Konfiguration und stellen Sie aufbrauchen für jede Protokollierung von ehcache kommt?

Mit Blick auf die javadocs für Juli, es sieht aus wie ich ein paar Umgebungsvariablen könnte sich ändern, welche LogManager Implementierung verwendet wird, und vielleicht, dass log4j Loggers im Juli Logger Klasse zu wickeln verwenden. Ist das der richtige Ansatz?

Verwendung von Einbau-JDK-Protokollierung würde eine solche Kopfschmerzen

Art der Ironie, dass einer Bibliothek, wenn die (meisten) der Rest der Welt statt 3rd-Party-Bibliotheken.

War es hilfreich?

Lösung

Ein Ansatz, den ich erfolgreich verwendet habe, ist slf4j als mein primäres Logging-API zu verwenden. Ich habe dann slf4j binden an log4j. 3rd-Party-Abhängigkeiten andere Frameworks (wie Juli) können überbrückte SLF4J .

Andere Tipps

Wir verwenden SLF4J auf unserem aktuellen Projekt und es ist für uns sehr gut funktioniert. SLF4J wird geschrieben von Ceki Gülcü, der Schöpfer von Log4J, und er hat eine wirklich gute Arbeit geleistet. In unserem Code verwenden wir die SLF4J Logging-APIs direkt, und wir konfigurieren SLF4J so dass Anrufe von den Jakarta Commons Logging (JCL), java.util.logging (Juli) und Log4J APIs sind alle auf den SLF4J APIs überbrückt. Wir müssen das tun, weil, wie wir Sie Dritten (Open Source) Bibliotheken verwenden, die verschiedene Logging-APIs gewählt haben.

Auf der Unterseite SLF4J konfigurieren Sie sich an eine bestimmte Logger-Implementierung zu verwenden. Es kommt mit einem internen oder „einfachen“ Logger, und Sie können dies außer Kraft setzen mit Log4J, jul, oder Logback . Die Konfiguration wird alles getan, was einfach durch in verschiedenen JAR-Dateien in Ihrem Classpath fällt.

Ursprünglich nutzten wir die Logback Implementierung geschrieben auch durch Ceki Gülcü. Dies ist sehr mächtig. Allerdings haben wir dann beschlossen, unsere Anwendung auf die Glassfish Java EE Application Server zu implementieren, deren Log Viewer erwartet jul-formatierte Nachrichten. So habe ich heute von Logback bis Juli geschaltet, und in nur wenigen Minuten ersetzt ich zwei Logback Gläser mit einem SLF4J Glas, die es an die Umsetzung Juli verbindet.

So wie @overthink, würde ich von ganzem Herzen mit SLF4J in Ihrem Setup empfehlen.

Es gibt eine einfachere Alternative als SLF4J Juli zu überbrücken mit log4j finden Sie unter http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Sie müssen nur auf dem Classpath die jul-log4j-Brücke setzen und eine Systemeigenschaft hinzu:

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

jul-log4j-Brücke ist nicht in Maven Mittel- und kann aus 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, sie aus Quellen mit den folgenden Schritten neu zu erstellen:

  1. svn co http: // svn. apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. bearbeiten pom.xml, ersetzt die Abhängigkeit von log4j: log4j: 1.2.15 mit log4j: Apache-log4j-Extras: 1.2.17 und die Abhängigkeit von Apache-log4j-Komponente entfernen
  3. mvn package

Oktober 2014

Seit der Version 2.1 von log4j die Komponente log4j-Juli existiert, die genau dies ermöglicht. Dennoch, falls Sie verwenden log4j 1, es muss möglich sein, um ein Upgrade auf log4j2 diesen Ansatz zu verwenden.

JDK Logging Adapter

Klasse LogManager

von log4j 1.x migrieren 2 LOG4J

Die slf4j Seite I hat eine Brücke glaube für das Bestehen java.util.logging Ereignisse über slf4j (und damit zu log4j).

Ja, der SLF4J Download enthält jul-to-slf4j die ich glaube, dass nicht nur. Es enthält einen Handler Juli Datensätze SLF4J zu übergeben.

@Yishai - Danke für den Link zu meinem Wiki veröffentlichen. Das Beispiel gibt Umleitungen Juli bis Log4J und ich habe es in einem Produktionssystem für ein paar Jahre laufen habe. JBoss 5.x bereits umleitet Juli bis Log4J, so nahm ich es, wenn wir ein Upgrade. Ich habe eine neuere Version, die SLF4J umleitet, die ich jetzt auf ein paar Dinge verwenden. Ich werde schreiben, dass, wenn ich eine Chance bekommen.

Allerdings SLF4J bereits hat es:

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

sollten Sie manuell hinzufügen, beim Start blies

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

Demo -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top