Ich benutze java.util.logging.Logger als Logging-Engine für meine Anwendung. Jede Klasse verwendet ihren eigenen Logger, dh jede Klasse hat:
private final Logger logger = Logger.getLogger(this.getClass().getName());
Ich möchte für alle meine Klassen eine Protokollierungsebene festlegen und diese ändern können (dh die Einstellung an einem Ort haben). Gibt es eine Möglichkeit, dies zu tun, außer mit einer globalen Level
Variable und jeden Logger manuell darauf einstellen?

Andi Thomas
Eine einfache Möglichkeit besteht darin, eine Protokollierungseigenschaftendatei zu verwenden, indem Sie dieses VM-Argument einfügen:
-Djava.util.logging.config.file="logging.properties"
wobei „logging.properties“ der Pfad zu einer Datei ist, die die Protokollierungskonfiguration enthält. Bei relativen Pfaden ist das Arbeitsverzeichnis des Prozesses von Bedeutung.
Fügen Sie in dieser Datei eine Zeile wie diese ein:
.level= INFO
Dadurch wird die globale Ebene festgelegt, die für bestimmte Handler und Protokollierer überschrieben werden kann. Beispielsweise kann die Ebene eines bestimmten Loggers wie folgt überschrieben werden:
com.xyz.foo.level = SEVERE
Eine Vorlage für eine Protokollierungseigenschaftendatei erhalten Sie unter jre6\lib\logging.properties.

morja
Wie Andy antwortete, sollten Sie in den meisten Fällen die Eigenschaftsdatei und das VM-Argument verwenden, daher ist es unabhängig von Ihrem Code.
Aber wenn Sie aus irgendeinem Grund programmgesteuert vorgehen möchten (ich selbst hatte in einem Fall einen guten Grund), können Sie auch so auf die Handler zugreifen:
Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.setLevel(Level.INFO);
for (Handler h : rootLogger.getHandlers()) {
h.setLevel(Level.INFO);
}
BEARBEITEN Ich habe setLevel zum Root-Logger hinzugefügt, wie searchengine27 in seiner Antwort darauf hingewiesen hat.
Die Handler sind Datei- oder Konsolen-Handler, die Sie über die Eigenschaften oder auch programmgesteuert einrichten.
Oder ändern Sie die Filter wie folgt:
Logger rootLogger = LogManager.getLogManager().getLogger("");
rootLogger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return "something".equals(record.getLoggerName());
}
});

Suchmaschine27
Ich mag also nicht alle Antworten hier ganz, also werde ich mich einmischen.
Verwendung der Konfigurationsdatei
Sie sehen hier viele Antworten, die Sie auffordern, die Konfigurationsdatei zu verwenden, da dies die beste Vorgehensweise ist. Ich möchte besser erklären, wie man das programmatisch macht, aber bevor ich das tue, möchte ich sagen, dass ich sehen kann, woher sie kommen, und in der Stimmung, objektiv zu sein, werde ich Sie ein wenig aufklären (vor allem, weil niemand sagt warum seine schlechte Praxis). Ich möchte eigentlich mitteilen, was jemand in einer separaten StackOverflow-Antwort gesagt hat, die sich auf das programmatische Einstellen des Logger-Levels bezieht (Warum werden die Level.FINE-Logging-Meldungen nicht angezeigt?):
Dies wird nicht empfohlen, da dies dazu führen würde, dass die globale Konfiguration außer Kraft gesetzt wird. Wenn Sie dies in Ihrer gesamten Codebasis verwenden, führt dies zu einer möglicherweise unüberschaubaren Protokollierungskonfiguration.
In diesem Sinne denke ich, dass Andy Thomas eine gute Antwort darauf hat, es nicht nicht-programmatisch zu tun.
Programmatisches Einstellen des Levels
Davon abgesehen möchte ich etwas detaillierter darauf eingehen, wie man es programmatisch macht, weil ich denke, dass es seinen Nutzen hat.
Stellen Sie sich ein Szenario vor, in dem Sie etwas mit einer Befehlszeilenschnittstelle schreiben und die Option haben, die Ausführlichkeit Ihrer Ausführung oder sogar den Ort anzugeben (wie in dynamischen Protokolldateien). Ich kann mich irren, aber Sie möchten dies wahrscheinlich nicht statisch in einer .conf-Datei tun. Vor allem, wenn Sie Ihre Benutzerbasis nicht dafür verantwortlich machen möchten, diese Dinge (aus welchem beliebigen Grund auch immer) in der Konfigurationsdatei einzustellen. Dies geht jedoch zu Lasten des obigen Zitats. Hier ist ein Beispiel dafür, wie Sie dies programmgesteuert tun können, indem Sie alle vorhandenen Handler auf dem Niveau halten, auf dem sie sich bereits befinden, und nur FileHandler
nehmen wir das neue Level an:
public static void setDebugLevel(Level newLvl) {
Logger rootLogger = LogManager.getLogManager().getLogger("");
Handler[] handlers = rootLogger.getHandlers();
rootLogger.setLevel(newLvl);
for (Handler h : handlers) {
if(h instanceof FileHandler)
h.setLevel(newLvl);
}
}
Ich wollte dies aus einem bestimmten Grund über die akzeptierte Antwort hinaus ausführen. Wenn Sie dies programmgesteuert tun, möchten Sie nur sicherstellen, dass Sie den Pegel für den Logger festlegen und der/die Handler. Es funktioniert so, dass es prüft, ob die Anfrage zu niedrig für den Logger ist, und wenn ja, wird sie verworfen. Dann haben die Handler die gleiche Prüfung, also sollten Sie sicherstellen, dass sowohl die Protokollierer als auch die Handler auf die gewünschte Stufe eingestellt sind.

Marcelovca90
Einzeiliger Java 8-Ansatz für Morjas Antwort:
Arrays.stream(LogManager.getLogManager().getLogger("").getHandlers()).forEach(h -> h.setLevel(Level.INFO));
JUL(java.util.logging) ist der Java-Standard-Logger in jvm.
Java-Protokollierungstechnologie – siehe Übersicht
Sie werden also feststellen, dass bereits eine Standardkonfigurationsdatei vorhanden ist C:\Program Files\Java\jre1.8.0_221\lib\logging.properties
Ich empfehle, dass Sie eine neue Konfigurationsdatei unter Ihrem Projekt erstellen, um die Standardeinstellung zu überschreiben, gehen Sie wie folgt vor:
Name der Konfigurationsdatei, logging.properties
alle Protokollebenen sind in zu finden Klassenstufe
handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format= [%1$tF %1$tT] [%4$-7s] %5$s %n
# your specific logger level
com.xyz.foo.level = SEVERE
Fügen Sie dann die jvm-Option hinzu, um die config
java -Djava.util.logging.config.file="logging.properties" -Duser.country=CN -Duser.language=en
user.country
und user.language
kann sich auf die Lokalisierung von Protokollnachrichten auswirken
10143400cookie-checkÄndern Sie die globale Einstellung für Logger-Instanzenyes