Wie dynamisch ändern log-level in SLF4j ODER Log4J
Kürzlich stieß ich auf eine Situation, in der Anwendung Loglevel dynamisch ändert. Application Admin kann Sie auf INFO/DEBUG/WARNEN von front-end. Basierend auf den log-level gewählt werden, ihn der Anwendung Protokollierung geändert werden muss.
Ich bin sicher, dass die Logger die dieses Szenario unterstützen, aber nicht sicher, wie kann ich erreichen dies. Wenn jemand von Euch eine Idee/Gedanken über dieses bitte lassen Sie mich wissen.
Dank im Voraus für Eure Hilfe.
-Narendra
- Sie können nicht dies tun, indem Sie die SLF4J-API, müssen Sie konfigurieren die logging-backend (log4j, in deinem Fall) mit seiner eigenen API.
- Möchten Sie ändern die Ebene, auf der Sie einige Nachrichten gesendet werden, in die logging-framework, oder das Niveau, das zum filtern von Nachrichten in das Protokoll geschrieben?
- Können Sie mir sagen, den Unterschied zwischen den beiden?
- Mögliche Duplikate von die Einstellung Protokoll-level-Nachricht, die zur Laufzeit in slf4j
- Es gibt eigentlich drei Möglichkeiten zum ändern der Protokollierungsstufe. (1) die änderung der Ebene aller logging ist die Ausgabe von einem appender, (2) ändern der level der logging-Ausgabe für ein Klasse-spezifische-logger und (3) eine änderung der Ebene der einzelnen logging-Anweisungen an bestimmten stellen im code. Mit
SLF4j
Sie nicht tun können, #3, aber Sie könnten in der log4j, wenn Sielogger.log("stuff", LEVEL);
seitLEVEL
eine variable. Letzteres wäre etwas, das nur in ganz bestimmten Situationen. So ist es wahrscheinlich Narendra gemeint ändern der Protokollierungsstufe pro Appen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten Logback http://logback.qos.ch/ - "Nachfolger der bekannten log4j Projekt, picking up, wo log4j lässt sich ab". Wenn Sie dazu aufgefordert werden, logback-classic sucht nach änderungen in der Konfiguration-Datei und automatisch neu konfigurieren, selbst wenn der Konfigurations-Datei geändert wird. Außerdem können Sie Steuern, Logback logging-Ebenen mit JMX.
Ist es nicht möglich, ändern Sie den log-level dynamisch in slf4j, aber einige backends für slf4j-Unterstützung, einschließlich log4j.
Diese Lösung bei mir funktioniert:
(Quelle: http://prateep.info/2015/12/12/Dynamically-change-log-level-in-SLF4j-Log4J-with-Standalone-Java-Class/)
Der Nachteil dieser Lösung ist, dass es verwendet das backend direkt, was Sie nicht tun sollen, wenn mit slf4j, weil der Punkt von slf4j ist eine Abstraktion, Weg von der spezifischen backend du verwendest.
Ich hatte dies einmal mit log4j. Nur so konnte ich herausfinden, wie zu tun, es war ein Telefonat getAllAppenders auf das Logger-Objekt. Dann eine Schleife durch die appenders. Wenn Sie verlängern die AppenderSkeleton Klasse (Sie sollten), werden Sie über die setThreshold Methode. Rufen Sie diese Methode mit Ihrem neuen Level als parameter. Nachfolgende Aufrufe an den logger verwenden soll, die neue Ebene. Damit wird die Ebene, in der Erinnerung, aber nicht in der log4j-Konfigurationsdatei. Sie können dies tun wollen, zu, es sei denn, es wird automatisch geändert, wenn der admin ändert den Pegel über das front-end. Wenn es eine option, möchten Sie vielleicht erwägen den folgenden Evgeniy Dorofeev Beratung und logback benutzen. Es klingt so, als wäre es einfacher.