2009-05-15 11 views
82

Ich habe eine bestehende Anwendung, die alle Protokollierung gegen log4j macht. Wir verwenden eine Reihe anderer Bibliotheken, die entweder auch log4j verwenden, oder loggen Sie gegen Commons Logging ein, was letztendlich log4j unter die Abdeckungen unserer Umgebung bringt. Eine unserer Abhängigkeiten protokolliert sogar gegen slf4j, was auch gut funktioniert, da es schließlich auch an log4j delegiert.Wie wird java.util.logging an log4j gesendet?

Nun, ich würde gerne ehcache zu dieser Anwendung für einige Caching-Anforderungen hinzufügen. Frühere Versionen von ehcache verwendeten commons-logging, was in diesem Szenario perfekt funktioniert hätte, aber ab version 1.6-beta1 haben sie die Abhängigkeit von commons-logging entfernt und stattdessen durch java.util.logging ersetzt.

Nicht wirklich vertraut mit der integrierten JDK-Protokollierung mit java.util.logging, gibt es eine einfache Möglichkeit, Log-Nachrichten an JUL Log4j protokolliert zu bekommen, so dass ich meine bestehende Konfiguration verwenden und einrichten kann für jede Aufzeichnung, die von ehcache kommt?

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

Eine Art von Ironie, dass die Verwendung einer integrierten JDK-Protokollierung durch eine Bibliothek solche Kopfschmerzen verursachen würde, wenn der Rest der Welt stattdessen Bibliotheken von Drittanbietern verwendet.

Antwort

36

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

+2

gute Verbindung, aber ich denke, Sie # jul-to-slf4j – araqnid

+0

Guten Fang gemeint. Ich habe die Antwort entsprechend aktualisiert. Vielen Dank! – overthink

+0

Das hört sich nach einem guten Ansatz an, außer dass ich es nicht zum Laufen bringen kann :( –

3

Die Website slf4j, glaube ich, hat eine Brücke für die Weitergabe java.util.logging Ereignisse über slf4j (und damit zu log4j).

Ja, der SLF4J-Download enthält jul-to-slf4j, was meiner Meinung nach genau das tut. Es enthält einen JUL-Handler, um Datensätze an SLF4J zu übergeben.

+0

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

18

Wir verwenden SLF4J auf unserem aktuellen Projekt und es hat sehr gut für uns gearbeitet. SLF4J wurde von Ceki Gülcü, dem Schöpfer von Log4J geschrieben und er hat wirklich großartige Arbeit geleistet. In unserem Code verwenden wir die SLF4J-Protokollierungs-APIs direkt und wir konfigurieren SLF4J so, dass Aufrufe von den APIs Jakarta Commons Logging (JCL), java.util.logging (JUL) und Log4J über die SLF4J-APIs gebrückt werden. Wir müssen das tun, weil wir wie Sie Bibliotheken von Drittanbietern (Open Source) verwenden, die verschiedene Protokollierungs-APIs ausgewählt haben.

Auf der Unterseite von SLF4J konfigurieren Sie es für die Verwendung einer bestimmten Logger-Implementierung. Es kommt mit einem internen oder "einfachen" Logger, und Sie können dies mit Log4J, JUL oder Logback überschreiben. Die Konfiguration erfolgt einfach durch Einfügen verschiedener JAR-Dateien in Ihren Klassenpfad.

Ursprünglich verwendeten wir die Logback-Implementierung, die auch von Ceki Gülcü geschrieben wurde. Das ist sehr mächtig. Wir haben uns jedoch entschieden, unsere Anwendung auf dem Glassfish Java EE-Anwendungsserver bereitzustellen, dessen Protokollanzeige JUL-formatierte Nachrichten erwartet. So wechselte ich heute von Logback zu JUL, und in nur wenigen Minuten ersetzte ich zwei Logback-Gläser durch ein SLF4J-Glas, das es mit der JUL-Implementierung verbindet.

So wie @overthink, ich würde wärmstens empfehlen, SLF4J in Ihrem Setup zu verwenden.

+7

Wie oft muss Ceki ein Logging-Framework/fascade neu erfinden? –

+0

@mP: Protokollierung mag nicht glamourös sein, aber es ist eine entscheidende Notwendigkeit für große kommerzielle Software. Und SLF4J löst das Problem der Integration von Code, der unterschiedliche Logging-Frameworks verwendet (durch die Wahl von Sun zur Entwicklung von java.utils.logging dringlicher gemacht, anstatt Log4J zu übernehmen). –

+3

@mP, slf4j war notwendig, weil die schlechte Arbeit, die Sun mit JUL gemacht hat. Logback ist eine Verzweigung von log4j, kein neues Projekt. –

2

@Yishai - Danke für den Link zu meinem Wiki. Das Beispiel dort leitet JUL zu Log4J um und ich habe es für ein paar Jahre in einem Produktionssystem ausgeführt. JBoss 5.x leitet JUL bereits zu Log4J um, also habe ich es beim Upgrade herausgenommen.Ich habe einen neueren, der zu SLF4J umleitet, den ich jetzt auf einigen Sachen verwende. Ich werde das posten, wenn ich eine Chance bekomme.

jedoch SLF4J hat es bereits:

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

12

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

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

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

jul-log4j-Brücke nicht in Maven Central ist und b e geholt aus diesem Repository:

<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 wieder aufzubauen mit den folgenden Schritten aus Quellen:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. <repository> 
        <id>psmith</id> 
        <url>http://people.apache.org/~psmith/logging.apache.org/repo</url> 
        <releases> 
        <enabled>false</enabled> 
        </releases> 
    </repository> 
    

    und dann mit verwendet editiere pom.xml, ersetze die Abhängigkeit von log4j: log4j: 1.2.15 mit log4j: apache-log4j-extras: 1.2.17 und entferne die Abhängigkeit von apache-log4j-compon ent

  3. mvn Paket
+0

Nicht einfacher, wenn Sie bereits SLF4J verwenden. :) –

+3

Ich denke, es ist einfacher, weil es getan werden kann, ohne Ihren Code zu ändern, Sie müssen nur eine Systemeigenschaft hinzufügen. SLF4J schlägt noch keinen ähnlichen Mechanismus vor, Sie ändern entweder den Code oder die Datei 'logging.properties'. –

+1

Dies ist in log4j2 leider nicht vorhanden :( – BeepDog