Ich habe eine vorhandene Anwendung, die die gesamte Protokollierung gegen log4j durchführt. Wir verwenden eine Reihe anderer Bibliotheken, die entweder ebenfalls log4j verwenden oder sich gegen Commons Logging anmelden, wodurch log4j in unserer Umgebung unter dem Deckmantel verwendet wird. Eine unserer Abhängigkeiten protokolliert sogar gegen slf4j, was ebenfalls gut funktioniert, da es schließlich auch an log4j delegiert wird.
Jetzt möchte ich dieser Anwendung ehcache für einige Caching-Anforderungen hinzufügen. In früheren Versionen von ehcache wurde die Commons-Protokollierung verwendet, was in diesem Szenario perfekt funktioniert hätte. Ab Version 1.6-Beta1 wurde jedoch die Abhängigkeit von der Commons-Protokollierung aufgehoben 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 bin, gibt es eine einfache Möglichkeit, Protokollnachrichten an JUL zu protokollieren, die gegen log4j protokolliert werden, sodass ich meine vorhandene Konfiguration verwenden und für jede kommende Protokollierung einrichten kann von ehcache?
Wenn ich mir die Javadocs für JUL anschaue, könnte ich eine Reihe von Umgebungsvariablen einrichten, um zu ändern, welche LogManager
Implementierung verwendet wird, und diese möglicherweise verwenden, um log4js Logger
in die JUL- Logger
Klasse einzuschließen . Ist das der richtige Ansatz?
Ein bisschen ironisch, dass die Verwendung der integrierten JDK-Protokollierung in einer Bibliothek solche Kopfschmerzen verursachen würde, wenn (fast) der Rest der Welt stattdessen Bibliotheken von Drittanbietern verwendet.
Wir verwenden SLF4J für unser aktuelles Projekt und es hat für uns sehr gut funktioniert. SLF4J wurde von Ceki Gülcü, dem Schöpfer 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 Jakarta Commons Logging- (JCL), java.util.logging- (JUL) und Log4J- APIs alle mit den SLF4J-APIs verbunden werden. Wir müssen dies 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 Logger-Implementierung. 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 verschiedener 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 dann jedoch entschlossen, unsere Anwendung auf dem Glassfish Java EE-Anwendungsserver bereitzustellen, dessen Protokollanzeige JUL-formatierte Nachrichten erwartet. Also habe ich heute von Logback zu JUL gewechselt und in nur wenigen Minuten zwei Logback-Gläser durch ein SLF4J-Glas ersetzt, das es mit der JUL-Implementierung verbindet.
Wie bei @overthink würde ich die Verwendung von SLF4J in Ihrem Setup wärmstens empfehlen.
quelle
Es gibt eine einfachere Alternative als SLF4J, um JUL mit log4j zu verbinden, siehe http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html
Sie müssen nur die jul-log4j-Brücke in den Klassenpfad einfügen und eine Systemeigenschaft hinzufügen:
jul-log4j-bridge befindet sich nicht in Maven Central und kann aus diesem Repository abgerufen werden:
und dann verwendet mit:
Es ist auch möglich, es aus Quellen mit den folgenden Schritten neu zu erstellen:
quelle
logging.properties
Datei.JulLog4jBridge.assimilate();
o_0jul-log4j-bridge
verwendet das nie freigegebeneapache-log4j-companions
Bundle (ein Backport von den verlassenenlog4j 1.3
). Es wird dir schwer fallen, es zu bauen. Natürlich wird auch die Brücke selbst vor der Freigabe aufgegeben.OKTOBER 2014
Seit Version 2.1 von log4j existiert die Komponente log4j-jul, die genau dies ermöglicht. Wenn Sie jedoch log4j 1 verwenden, muss ein Upgrade auf log4j2 möglich sein, um diesen Ansatz verwenden zu können.
JDK-Protokollierungsadapter
Klasse LogManager
Migrieren Sie von log4j 1.x zu log4j 2
quelle
Ich glaube, die slf4j-Site verfügt über 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 es genau das tut. Es enthält einen JUL-Handler zum Übergeben von Datensätzen an SLF4J.
quelle
@Yishai - Danke, dass du den Link zu meinem Wiki gepostet hast. Das dortige Beispiel leitet JUL an Log4J weiter und ich habe es einige Jahre lang in einem Produktionssystem ausgeführt. JBoss 5.x leitet JUL bereits an Log4J weiter, daher habe ich es beim Upgrade entfernt. Ich habe eine neuere, die zu SLF4J umleitet, die ich jetzt für einige Dinge verwende. Ich werde das posten, wenn ich eine Chance bekomme.
SLF4J hat es jedoch bereits:
http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j
quelle
Sie sollten blasen beim Start manuell hinzufügen
Demo -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d
quelle