2010-04-09 2 views
7

Google Guice hat eine built-in logger binding. Aber was, wenn ich einen Commons Logging oder Log4j Logger benutzen möchte?Wie bekomme ich Google Guice, um einen benutzerdefinierten Logger zu injizieren, sagen ein Commons-Logging oder Log4j Logger

Kann ich guice einen Log von

LogFactory.getLog(CLASS.class) 

Aber mit dem gleichen Verhalten wie in Einbau-Bindung erstellt zu injizieren:

Die Bindung stellt automatisch die Logger Namen auf den Namen die Klasse, in die der Logger eingespritzt wird ..


Macht es überhaupt Sinn? Oder schreibe ich einfach den eingebauten java Logger? Oder einfach commons-logging ohne Injektionen?

+0

Nein, es macht Sinn. Log4j unterstützt mehr Protokollierungsebenen und hat mehr verfügbare Appender, daher macht es Sinn für mich, es anstelle des eingebauten Loggers zu verwenden. –

Antwort

11

Die Seite CustomInjections auf dem Guice-Wiki beschreibt genau, wie man einen Logger injiziert, der durch die Klasse benannt ist, in die er injiziert wird.

+0

Netter Link. Wie ein schmerzhafter Prozess, aber dennoch funktional. –

+0

Danke für den Link. Es hat für mich funktioniert. Ich habe diese Strategie verwendet, um eine SLF4J-Lösung zu implementieren. –

+3

Für alle, die im Beispiel über die InjectLogger-Klasse verwirrt sind: Erstellen Sie einfach eine leere Annotation-Klasse namens "InjectLogger" in Ihrem Projekt. Es ist keine externe Abhängigkeit (das war, was ich zuerst annahm). –

1

Sie haben die Wahl. Ich habe logback mit Guice erfolgreich benutzt, die Methode verwendend, die im Wiki ausführlich beschrieben wird.

Werfen Sie einen Blick auf das Projekt sli4j. Es könnte nützlich sein.

0

Guice ist sehr nützlich für die Injektion verschiedener Implementierungen einer Schnittstelle. Dies ist hier nicht der Fall, da die verschiedenen Logging-Implementierungen alle unterschiedliche APIs haben.

Wenn Sie die aktuelle Protokollimplementierung später während der Entwicklung gegen eine Schnittstelle austauschen möchten, verwenden Sie commons logging oder slf4j.

+0

Hibernate verwendet SLF4J und ich integrierte beide in eine Guice-basierte Anwendung ohne Probleme, so kann ich es empfehlen, obwohl ich nicht mit Commons Logging gespielt habe. –

0

Obwohl Sie das mitgelieferte java.util.logging.Logger Logger nicht außer Kraft setzen können, binden Sie einen neuen Logger wie würden Sie jede andere Klasse:

bind(Log.class).to(LogFactory.getLog(YourClass)); // or toInstance(...); 

Aber ein benannter Logger zu schaffen wird ein bisschen schwieriger sein.

Wenn Sie den Google Guice-Code (u til.BinderImpl.java:87) durchsuchen, können Sie sehen, wie sie für jede Instanz des Loggers, der injiziert wird, einen eindeutigen Klassennamen zuweisen. Ich habe es jedoch nicht sorgfältig genug untersucht, um festzustellen, ob es leicht reproduzierbar ist.

Es könnte möglich sein, einen Provider zu erstellen oder eine Factory zu injizieren, die irgendwie Zugriff auf den Kontext hat, damit Sie einen benannten Logger bereitstellen können.

+0

Ich verstehe das nicht. Wenn Sie YourClass explizit im Binder definieren, erhalten Sie die Protokolle derselben Klasse für die gesamte Anwendung. –

Verwandte Themen