Ich versuche zum log4j
ersten Mal SLF4J (mit Bindung) zu verwenden.
Ich möchte 3 verschiedene Logger mit Namen konfigurieren, die von einer LoggerFactory zurückgegeben werden können, die verschiedene Ebenen protokolliert und die Nachrichten an verschiedene Appender weiterleitet:
- Logger 1 "FileLogger" protokolliert DEBUG und hängt an
DailyRollingFileAppender
- Logger 2 "TracingLogger" protokolliert TRACE + und hängt an a
JmsAppender
- Logger 3 "ErrorLogger" protokolliert ERROR + und hängt an einen anderen an
JmsAppender
Außerdem möchte ich, dass sie programmgesteuert konfiguriert werden (in Java im Gegensatz zu XML oder einer log4j.properties
Datei).
Ich stelle mir vor, dass ich diese Logger
s normalerweise irgendwo in einem Bootstrapping-Code definieren würde , wie bei einer init()
Methode. Da ich jedoch verwenden möchte slf4j-log4j
, bin ich verwirrt darüber, wo ich Logger definieren und sie dem Klassenpfad zur Verfügung stellen könnte.
Ich glaube nicht, dass dies eine Verletzung des zugrunde liegenden Zwecks von SLF4J (als Fassade) ist, da mein Code, der die SLF4J-API verwendet, niemals wissen wird, dass diese Logger existieren. Mein Code ruft nur normal die SLF4J-API auf, die sie dann an die log4j-Logger weiterleitet, die er im Klassenpfad findet.
Aber wie konfiguriere ich diese log4j-Logger im Klassenpfad ... in Java?!
Antworten:
Sie können Appender programmgesteuert zu Log4j hinzufügen / entfernen:
Ich würde vorschlagen, dass Sie es irgendwo in ein init () einfügen, wo Sie sicher sind, dass dies vor allem anderen ausgeführt wird. Sie können dann alle vorhandenen Appender im Root-Logger mit entfernen
und beginnen Sie mit dem Hinzufügen Ihrer eigenen. Sie benötigen natürlich log4j im Klassenpfad, damit dies funktioniert.
Anmerkung:
Sie können beliebige
Logger.getLogger(...)
Appender hinzufügen. Ich habe gerade den Root-Logger genommen, weil er am Ende aller Dinge steht und alles verarbeitet, was durch andere Appender in anderen Kategorien geleitet wird (sofern nicht anders konfiguriert, indem das Additivitätsflag gesetzt wird).Wenn Sie wissen möchten, wie die Protokollierung funktioniert und wie entschieden wird, wo Protokolle geschrieben werden, lesen Sie dieses Handbuch um weitere Informationen dazu zu erhalten.
Zusamenfassend:
erhalten Sie einen Logger für die Kategorie "com.fizz".
Für das obige Beispiel bedeutet dies, dass alles, was damit protokolliert wird, an die Konsole und den Dateianhänger im Root-Logger weitergeleitet wird.
Wenn Sie einen Appender zu Logger.getLogger ("com.fizz"). AddAppender (newAppender) hinzufügen, wird die Protokollierung
fizz
von allen Appendern aus dem Root-Logger und dem ausgeführtnewAppender
.Sie erstellen keine Logger mit der Konfiguration, sondern stellen nur Handler für alle möglichen Kategorien in Ihrem System bereit.
quelle
Logger fizz = LoggerFactory.getLogger("com.fizz");
Danke!Es hört sich so an, als würden Sie versuchen, log4j von "beiden Seiten" (dem Consumer-Ende und dem Konfigurations-Ende) zu verwenden.
Wenn Sie gegen die slf4j-API codieren möchten, aber die Konfiguration der log4j-Logger, die der Klassenpfad zurückgibt, im Voraus (und programmgesteuert) festlegen möchten, müssen Sie unbedingt eine Protokollierungsanpassung haben, die eine verzögerte Konstruktion verwendet.
Mit diesem Ansatz müssen Sie sich keine Gedanken darüber machen, wo / wann Ihre log4j-Logger konfiguriert werden. Wenn der Klassenpfad zum ersten Mal nach ihnen fragt, werden sie träge konstruiert, zurückgegeben und über slf4j verfügbar gemacht. Hoffe das hat geholfen!
quelle
Wenn Sie einen Appender in den log4j-Eigenschaften definiert haben und ihn programmgesteuert aktualisieren möchten, legen Sie den Namen in den log4j-Eigenschaften fest und rufen Sie ihn nach Namen ab.
Hier ist ein Beispiel für den Eintrag log4j.properties:
Gehen Sie wie folgt vor, um es zu aktualisieren:
quelle
Wenn jemand nach einer programmgesteuerten Konfiguration von log4j2 in Java sucht, kann dieser Link hilfreich sein: ( https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class )
Hier ist der Basiscode zum Konfigurieren eines Console Appender:
Dadurch wird der Standard- RootLogger neu konfiguriert und ein neuer Appender erstellt .
quelle