2009-06-12 6 views
1

Ich benutze java.util.logging.Logger Anmeldung in meinem Programm. Wie aktiviere ich FINE Logging für eine einzelne Klasse, während es für jede andere Klasse auf WARNING setzen?Wie FINE-Protokollierung für eine einzelne Java-Klasse aktivieren

Ich würde es vorziehen, dies programmatisch in meiner main() Methode zu tun, anstatt zusätzliche Eigenschaftendateien einrichten zu müssen.

+0

Grundsätzlich die gleiche Frage wie http://stackoverflow.com/questions/470430/java-util-logging-logger-doesnt-respect-java-util-logging-level. –

Antwort

1
Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE); 
+0

Das ist in der Nähe, funktioniert aber aus zwei Gründen nicht: 1) Ich möchte den Code in meine Hauptklasse einfügen können, damit nicht alle Benutzer meiner Dienstklasse die FINE-Protokollierung sehen müssen. 2) Es scheint, dass selbst wenn ich das mache, was Sie vorgeschlagen haben, der Handler immer noch alle meine FINE-Nachrichten verschluckt. –

0

Ich glaube, dass Sie Ihren Log-Level für Ihre Handler und Ihre spezifische Klasse Logger auf FINE gesetzt, während für den Rest Ihrer Code-Basis WARNUNG aller anderen Logger s halten sollte es tun. Sowohl der Logger als auch der Handler müssen den Ebenenfilter für eine zu protokollierende Nachricht übergeben.

0

Wenn Sie nicht möchten, dass ein Logger für jede einzelne in Frage stehende Klasse definiert wird, sondern Logger zwischen Klassen teilen möchten, können Sie alternativ Ihren eigenen java.util.logging.Handler implementieren, der seine eigene Filtermethode hat Klassennamen, die die von LogRecord.getSourceClassName() bereitgestellten Informationen verwenden.

0

Nun, hier ist eine Methode, die ich meiner Mail-Klasse hinzugefügt habe, die tatsächlich funktioniert. Ich würde immer noch Verbesserungen von anderen begrüßen.

private static void setupLogging() { 
    // To enable FINE logging in a single class, apparently this bewildering 
    // maze of statements is required. 
    Logger.getLogger("").setLevel(Level.FINE); 
    for (Handler handler : Logger.getLogger("").getHandlers()) { 
    handler.setLevel(Level.FINE); 
    } 
    MyOtherClass.logger.setLevel(Level.FINE); 
    Logger.getLogger("").setLevel(Level.WARNING); 
} 
0

Ich weiß, dass das OP gebeten hat, dies programmatisch zu tun, aber hier ist ein Beispiel, wie man es auch in der Eigenschaftendatei tut.

Vorbehalt: Ich dachte, es war der Aufnahme wert, da der Header nicht programmatisch angibt und viele Entwickler wollen es durch die logging.properties verwalten. Auch gibt es nicht wirklich viel Online darüber, es kann verwirrend sein und ist etwas anders, sagen wir log4j

Die Root-Protokollierungsebene wird durch die .level Config angezeigt. Dies legt fest, welche Ereignisse standardmäßig erfasst und für die Protokollierung verteilt werden. Die root-Protokollierungsstufe ist die Ebene, die vom "root logger" in der Protokollierungshierarchie verwendet wird. Siehe this onjava article for more info on the logging hierarchy.

Im Folgenden wird die root-Protokollierungsstufe auf WARNING gesetzt, sodass normalerweise nur WARNING-Ereignisse erfasst werden. Dies wird von allen Kind-Logger in der Hierarchie geerbt, wenn Sie nichts anderes konfigurieren (später):

.level=WARNING 

Diese Wurzel-Protokollebene zeigt nur das, was erfasst wird, nicht das, was ist „verteilt“. Wie ein erfasstes Ereignis (Nachricht) verteilt wird, hängt von den Handlern ab, die mit dem Logger verbunden sind. Zum Beispiel wird ein ConsoleHandler das Ereignis an die Konsole ausgeben. Zum Beispiel:

java.util.logging.ConsoleHandler.level = WARNING 

Diese ConsoleHandler.level gibt die Ebene, für die sollte dieser Handler verteilen - oder Druck - die Nachricht. Wenn also eine FINE-Nachricht mit der obigen Konfiguration empfangen wird, druckt dieser Handler sie nicht. Es werden jedoch alle Nachrichten mit einer WARNING-Protokollstufe oder höher gedruckt.

auf ALLE Einstellung wird sichergestellt, dass die Console alle Meldungen auf der Konsole gedruckt wird (ein müssen wir auch die Root-Ebene konfigurieren, dass alle, um sicherzustellen, werden erfasst):

.level=ALL 
java.util.logging.ConsoleHandler.level = ALL 

Dies ist jedoch eine Menge schaffen würde von Lärm, den wir auch nicht wollen.Also, die FINE-Level-Ereignisse zu diesen Klassen reduzieren wir interessiert sind, ändern wir die Protokollierungsebene dieser spezifischen Logger nur:

com.level = WARNING 
com.mypackage.MyClass1.level = FINE 
com.mypackage.MyClass2.level = FINE 
com.mypackage.mysubpackage.MyClass3.level = FINE 

Beachten Sie, dass in den oben genannten, ich habe ausdrücklich die Pegel für der "com" Logger auf WARNUNG.

Verwandte Themen