Warum werden die Level.FINE-Protokollierungsnachrichten nicht angezeigt?
Den JavaDocs für java.util.die Protokollierung.Level
Zustand:
Ebenen in absteigender Reihenfolge sind:
SEVERE
(höchster Wert)WARNING
INFO
CONFIG
FINE
FINER
FINEST
(niedrigster Wert)
Quelle
import java.util.logging.*;
class LoggingLevelsBlunder {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
logger.setLevel(Level.FINER);
System.out.println("Logging level is: " + logger.getLevel());
for (int ii=0; ii<3; ii++) {
logger.log(Level.FINE, ii + " " + (ii*ii));
logger.log(Level.INFO, ii + " " + (ii*ii));
}
}
}
Ausgabe
Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .
Problem statement
Meinem Beispiel wird die Level
zu FINER
also ich wurde erwartet, um zu sehen 2 Nachrichten for-each-Schleife. Stattdessen sehe ich eine einzelne Nachricht für jede Schleife (die Level.FINE
Nachrichten fehlen).
Frage
Was geändert werden muss, um zu sehen, die FINE
(, FINER
oder FINEST
) Ausgang?
Update (Lösung)
Dank Vineet Reynolds' Antwortdiese version funktioniert nach meiner Erwartung. Es zeigt 3xINFO
Nachrichten & 3xFINE
Nachrichten.
import java.util.logging.*;
class LoggingLevelsBlunder {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
//LOG this level to the log
logger.setLevel(Level.FINER);
ConsoleHandler handler = new ConsoleHandler();
//PUBLISH this level
handler.setLevel(Level.FINER);
logger.addHandler(handler);
System.out.println("Logging level is: " + logger.getLevel());
for (int ii=0; ii<3; ii++) {
logger.log(Level.FINE, ii + " " + (ii*ii));
logger.log(Level.INFO, ii + " " + (ii*ii));
}
}
}
InformationsquelleAutor der Frage Andrew Thompson | 2011-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Logger nur die Meldung protokolliert, d.h. Sie erstellen die log-Datensätze (oder der Anmeldung Anfragen). Sie nicht veröffentlicht, die Nachrichten an die Destinationen, die von den Handlern. Einstellen der Ebene der logger nur bewirkt, dass es erstellen log-Einträgen die entsprechende Ebene oder höher.
Verwenden Sie möglicherweise eine
ConsoleHandler
(ich konnte nicht ableiten, wo Sie Ihre Ausgabe-System.err oder eine Datei, aber ich würde davon ausgehen, dass es der ehemalige), die standardmäßig auf publishing-Protokoll Aufzeichnungen von der EbeneLevel.INFO
. Sie müssen zum konfigurieren dieser Prozedur zu veröffentlichen, die log-records der EbeneLevel.FINER
und höher, für das gewünschte Ergebnis.Ich würde empfehlen, das Lesen der Java-Logging-Übersicht Leitfaden, um zu verstehen, die zugrunde liegenden design. In der Anleitung wird der Unterschied zwischen dem Begriff von einem Logger und Handler.
Bearbeitung der hf-Ebene
1. Mithilfe der Konfigurations-Datei
Java.util.logging-properties-Datei (standardmäßig ist dies die
logging.properties
Datei inJRE_HOME/lib
) verändert werden können, ändern Sie die Standard-level der ConsoleHandler:2. Erstellen Handler zur Laufzeit
Dies ist nicht empfehlenswert, denn es führen würde, überschreiben die Globale Konfiguration. Mit dieser im gesamten code-Basis wird das Ergebnis in einer möglicherweise unüberschaubar, logger-Konfiguration.
InformationsquelleAutor der Antwort Vineet Reynolds
Warum
java.util.die Protokollierung hat einen root-logger, der standardmäßig auf
Level.INFO
und ein ConsoleHandler zugeordnet ist, die auch standardmäßigLevel.INFO
.FINE
ist niedriger alsINFO
so fein, Nachrichten werden standardmäßig nicht angezeigt.Lösung 1
Erstellen Sie einen logger für die gesamte Anwendung, z.B. von Ihrem Paket-Namen oder verwenden Sie
Logger.getGlobal()
und Haken Sie Ihre eigenen ConsoleLogger.Dann bitten root-logger zu shut up (zur Vermeidung einer doppelten Ausgabe von higher level-Nachrichten), oder Fragen Sie Ihren logger an nicht vorwärts Protokolle root.
Lösung 2
Alternativ können Sie das untere das root-logger ' s bar.
Können Sie Sie von code:
Oder mit logging-Konfigurationsdatei, wenn Sie mit es:
Durch eine Senkung der globalen Ebene, können Sie sehen, beginnen Nachrichten von Kern-Bibliotheken, wie von einigen Swing oder JavaFX-Komponenten.
In diesem Fall können Sie eine Filter auf der root-logger, um Nachrichten zu filtern, die nicht aus Ihrem Programm.
InformationsquelleAutor der Antwort Sheepy
warum ist mein java-Protokollierung nicht funktioniert
bietet eine jar-Datei, die Ihnen helfen, herauszufinden, warum Ihre Anmeldung nicht wie erwartet funktioniert.
Es gibt Ihnen einen kompletten dump von was-Logger und Handler installiert wurden und was Werte sind und auf welcher Ebene in der logging-Hierarchie.
InformationsquelleAutor der Antwort matthew
WARUM
Wie erwähnt von @Sheepy, der Grund, warum es nicht funktioniert, ist, dass
java.util.logging.Logger
hat einen root-logger, der standardmäßig aufLevel.INFO
und dieConsoleHandler
an das root-logger auch standardmäßigLevel.INFO
. Deshalb, um zu sehen, dieFINE
(,FINER
oderFINEST
) Leistung, die Sie benötigen, um den Standard-Wert der root-logger und seineConsoleHandler
zuLevel.FINE
wie folgt:Das problem der Update (Lösung)
Wie erwähnt von @Minuten, haben Sie die Nachrichten zweimal gedruckt auf der Konsole für
INFO
und oben: zuerst durch die anonyme logger, dann von seinen Eltern, den root-logger, die hat auch eineConsoleHandler
eingestelltINFO
standardmäßig. Zum deaktivieren der root-logger, müssen Sie diese code-Zeile:logger.setUseParentHandlers(false);
Gibt es andere Möglichkeiten, um zu verhindern, dass Protokolle verarbeitet werden, indem Standard-Console-handler der root-logger erwähnt von @Sheepy, z.B.:
Aber
Logger.getLogger("").setLevel( Level.OFF );
wird nicht funktionieren, denn es blockiert nur die Nachricht weitergegeben, die direkt an den root-logger, nicht die Nachricht kommt von einem Kind logger. Um zu veranschaulichen, wie dieLogger Hierarchy
funktioniert, ich zeichne das folgende Diagramm:public void setLevel(Level newLevel)
den Protokoll-level festlegen, welche message Ebenen werden protokolliert, von diesem logger. Nachricht Stufen niedriger als dieser Wert, werden verworfen. Die Ebene Wert Ebene.Sie können verwendet werden, um die Protokollierung deaktivieren. Wenn die neue Ebene ist null, es bedeutet, dass dieser Knoten erbt das Niveau von vor seiner nächsten Vorfahren mit einer bestimmten (nicht-null -) level-Wert.InformationsquelleAutor der Antwort Joe Yichong
Fand ich meinen eigentlichen problem und es wurde auch nicht erwähnt in einer Antwort auf diese Frage: einige meiner unit-tests wurden verursacht Protokollierung von Initialisierungs-code mehrmals ausgeführt werden, die innerhalb der gleichen test-suite, vermasselt die Protokollierung der tests.
InformationsquelleAutor der Antwort Alex R
Versucht andere Varianten, diese können richtig sein
InformationsquelleAutor der Antwort zhen_khokh
Erscheint diese Lösung besser für mich, in Bezug auf Wartbarkeit und design für den Wandel:
Erstellen Sie die logging-Eigenschaft-Datei einbetten es in der Ressource-Projekt-Ordner in die jar-Datei:
Laden der property-Datei von code:
InformationsquelleAutor der Antwort user2627331