Bei Verwendung von log4j ist die Logger.log(Priority p, Object message)
Methode verfügbar und kann zum Protokollieren einer Nachricht auf einer zur Laufzeit festgelegten Protokollebene verwendet werden. Wir nutzen diese Tatsache und diesen Tipp , um stderr zu einem Logger auf einer bestimmten Log-Ebene umzuleiten.
slf4j hat keine generische log()
Methode, die ich finden kann. Bedeutet das, dass es keine Möglichkeit gibt, das oben Genannte umzusetzen?
slf4j 2.0
. jira.qos.ch/browse/SLF4J-124 Siehe meine Antwort für Details und eine möglicheslf4j 1.x
Problemumgehung.Antworten:
Es gibt keine Möglichkeit, dies zu tun
slf4j
.Ich stelle mir vor, dass der Grund dafür, dass diese Funktionalität fehlt, darin besteht, dass es nahezu unmöglich ist, einen
Level
Typ zuslf4j
erstellen, der effizient demLevel
(oder einem gleichwertigen) Typ zugeordnet werden kann, der in allen möglichen Protokollierungsimplementierungen hinter der Fassade verwendet wird. Alternativ haben die Designer entschieden, dass Ihr Anwendungsfall zu ungewöhnlich ist , um den Aufwand für die Unterstützung zu rechtfertigen.Über Bezug auf den Anwendungsfall von @ ripper234 ( Komponententests ) denke ich, dass die pragmatische Lösung darin besteht, die Komponententests so zu ändern , dass sie genau wissen, welches Protokollierungssystem sich hinter der slf4j-Fassade befindet ... wenn die Komponententests ausgeführt werden.
quelle
org.slf4j.Logger
: Debug, Fehler, Info, Trace, Warnung.Richard Fearn hat die richtige Idee, also habe ich die ganze Klasse basierend auf seinem Skelettcode geschrieben. Es ist hoffentlich kurz genug, um hier zu posten. Kopieren und einfügen zum Genießen. Ich sollte wahrscheinlich auch eine magische Beschwörung hinzufügen: "Dieser Code ist gemeinfrei"
quelle
Versuchen Sie, zu Logback zu wechseln, und verwenden Sie
Ich glaube, dies ist der einzige Aufruf von Logback und der Rest Ihres Codes bleibt unverändert. Logback verwendet SLF4J und die Migration ist problemlos, nur die XML-Konfigurationsdateien müssen geändert werden.
Denken Sie daran, die Protokollstufe zurückzusetzen, nachdem Sie fertig sind.
quelle
Sie können dies mit Java 8 Lambdas implementieren.
quelle
LevelLogger
). Dies ist keine gute Sache, da es sich im Allgemeinen um sehr nützliche Informationen handelt.Dies kann mit einer
enum
und einer Hilfsmethode erfolgen:Sie können andere Varianten hinzufügen
log
, beispielsweise wenn Sie generische Äquivalente von SLF4Js 1-Parameter oder 2-Parameterwarn
/error
/ etc. Methoden.quelle
Wenn Sie eine vollständig SLF4J-kompatible Lösung für dieses Problem suchen, sollten Sie sich die Lidalia SLF4J-Erweiterungen ansehen - sie befinden sich in Maven Central.
quelle
Ich habe gerade so etwas gebraucht und mir Folgendes ausgedacht:
Verwendung:
Der Logger wird während des Aufrufs übergeben, daher sollten die Klasseninformationen in Ordnung sein und funktionieren gut mit der @ Slf4j-Lombok-Annotation.
quelle
DEBUG
fehlt als Konstante.LogLevel
als Klasse undlog
als Methode protokolliert, wodurch die Protokolle weniger aussagekräftig werden.Es ist nicht möglich, eine Protokollstufe in sjf4j sofort anzugeben
1.x
. Es besteht jedoch die Hoffnung, dass slf4j das Problem2.0
beheben kann . In 2.0 könnte es so aussehen:In der Zwischenzeit können Sie für slf4j 1.x diese Problemumgehung verwenden:
Kopieren Sie diese Klasse in Ihren Klassenpfad:
Dann können Sie es so verwenden:
Dies gibt ein Protokoll wie folgt aus:
Lohnt es sich?
LogLevel
Der Quellcode als minimales Beispiel wird auf GitHub gehostet .
quelle
LogMethod
Schnittstelle muss öffentlich sein, damit sie mit Klassen außerhalb ihres Pakets arbeiten kann. Ansonsten funktioniert es wie vorgesehen. Vielen Dank!Mit der slf4j-API ist es nicht möglich, die Protokollstufe dynamisch zu ändern, aber Sie können die Protokollierung (falls Sie diese verwenden) selbst konfigurieren. In diesem Fall erstellen Sie eine Factory-Klasse für Ihren Logger und implementieren den Root-Logger mit der von Ihnen benötigten Konfiguration.
Nachdem Sie den Root-Logger konfiguriert haben (nur einmal reicht aus), können Sie das Abrufen eines neuen Loggers an delegieren
Denken Sie daran, dasselbe zu verwenden
loggerContext
.Das Ändern der Protokollstufe ist mit dem Root-Logger von einfach
loggerContext
.quelle
Antwort bestätigen Ondrej Skopek
Sie erhalten Ergebnis:
quelle
Ich bin gerade auf ein ähnliches Bedürfnis gestoßen. In meinem Fall wird slf4j mit dem Java-Protokollierungsadapter (dem jdk14-Adapter) konfiguriert. Mit dem folgenden Code-Snippet konnte ich die Debug-Ebene zur Laufzeit ändern:
quelle
Basierend auf der Antwort von massimo virgilio habe ich es auch geschafft, es mit slf4j-log4j unter Verwendung von Selbstbeobachtung zu tun. HTH.
quelle
Hier ist eine Lambda-Lösung, die in einer Hinsicht nicht so benutzerfreundlich ist wie die von @Paul Croarkin (das Level wird effektiv zweimal bestanden). Aber ich denke (a) der Benutzer sollte den Logger übergeben; und (b) AFAIU die ursprüngliche Frage lautete nicht nach einem bequemen Weg für überall in der Anwendung, sondern nur nach einer Situation mit wenigen Verwendungen innerhalb einer Bibliothek.
Da slf4j ein Throwable (dessen Stack-Trace protokolliert werden soll) innerhalb des varargs-Parameters zulässt , besteht meines Erachtens keine Notwendigkeit, die Hilfsmethode
log
für andere Benutzer als zu überladen(String, Object[])
.quelle
Ich konnte dies für die JDK14-Bindung tun, indem ich zuerst die SLF4J-Logger-Instanz anforderte und dann die Ebene für die Bindung festlegte. Sie können dies für die Log4J-Bindung versuchen.
quelle
Die Methode, die ich verwende, besteht darin, die ch.qos.logback-Module zu importieren und dann die slf4j Logger-Instanz in einen ch.qos.logback.classic.Logger zu typisieren. Diese Instanz enthält eine setLevel () -Methode.
Um die möglichen Protokollierungsstufen herauszufinden, können Sie die Klasse ch.qos.logback auflösen, um alle möglichen Werte für Stufe anzuzeigen :
Die Ergebnisse sind die folgenden:
quelle
Mit Java Introspection können Sie dies zum Beispiel tun:
quelle
Nein, es gibt eine Reihe von Methoden, info (), debug (), warn () usw. (dies ersetzt das Prioritätsfeld).
hat einen Blick auf http://www.slf4j.org/api/org/slf4j/Logger.html für den vollen Logger api.
quelle