7 Stimmen

Warum filtert der Log4j rootLogger die Log-Ereignisse nicht nach dem Event-Level?

Warum ist die Log4j rootLogger in meiner Anwendung die Protokollereignisse nicht nach Stufe filtern? In meiner log4j.properties Ich habe mehrere Logger:

log4j.rootLogger=info,stdout
log4j.logger.com.name.myapp=debug,myapp
log4j.logger.org.castor=debug,castor
log4j.logger.org.exolab.castor=debug,castor
log4j.logger.org.hibernate=debug,hibernate
log4j.logger.org.springframework=debug,spring

Jeder der Logger empfängt und speichert zahlreiche Log-Ereignisse auf folgenden Ebenen DEBUG und darüber hinaus, was ich erwarte und wünsche. Die rootLogger jedoch trotz der Einstellung auf Niveau INFO zeigt ebenfalls alle diese Ereignisse an, einschließlich der DEBUG Das ist nicht das, was ich erwarte und nicht das, was ich mir wünsche. Stattdessen würde ich erwarten, dass es die DEBUG Ereignisse, sondern zeigen nur die Ereignisse der Ebene INFO und höher ( WARN , ERROR y FATAL ), und das ist auch das, was ich will. Warum zeigt rootLogger alle Ereignisse an?

7voto

Derek Mahar Punkte 26470

Siehe dies réponse zu einer ähnlichen Frage über die Logger-Verkettung in Log4j:

Die Funktionsweise der Log4j-Verkettung ist ein wenig kontraintuitiv (zumindest für mich). Wenn die Anforderungsebene gleich oder höher ist als der Schwelle des spezifischsten passenden Logger liegt, wird sie akzeptiert. Sobald die Anfrage akzeptiert wurde, wird sie von der gesamten Kette der Vorgängern bearbeitet, unabhängig von deren Schwellenwerte!

Das bedeutet, dass unabhängig davon, wie hoch Sie den Schwellenwert des Root-Loggers einstellen, dieser immer das Protokollereignis annimmt und ausgibt, das jeder andere Logger annimmt, es sei denn, Sie deaktivieren die Verkettung für diesen Child-Logger oder setzen den Schwellenwert seines Appenders ausdrücklich auf eine höhere Stufe.

In diesem Fall gibt es also zwei Möglichkeiten, wie Sie verhindern können, dass der Root-Logger die Ereignisse der anderen Logger aufzeichnet. Die erste ist der selektivere Ansatz der Deaktivierung der Verkettung von Log-Ereignissen:

log4j.additivity.com.name.myapp=false
log4j.additivity.org.castor=false
log4j.additivity.org.exolab.castor=false
log4j.additivity.org.hibernate=false
log4j.additivity.org.springframework=false

Die zweite Möglichkeit ist einfacher, aber restriktiver, da sie alle Ereignisse auf der Konsole unterdrückt, die niedriger sind als INFO ( DEBUG y TRACE ):

log4j.appender.stdout.Threshold=info

2voto

Jonathon Faust Punkte 12196

Überprüfen Sie die Vererbung, die in der Einleitung . Wenn Sie einen Level auf Paketebene angeben, erbt dieser nicht den Level des Root-Loggers. Sie verwenden debug in den von Ihnen angegebenen Paketen, nicht info. Die Angabe des Levels setzt alles außer Kraft, was geerbt wurde.

Wenn Sie den Level des Root-Loggers erben wollen, müssen Sie die Level-Spezifikation in Ihren Logger-Konfigurationen loswerden.

2voto

Mornedhel Punkte 163

Um den Rootlogger abzurufen, verwenden Sie Logger.getRootLogger() ? Wenn nicht, erhalten Sie möglicherweise nicht den echten Root-Logger. Wenn dies der Fall ist, stellen Sie sicher, dass der Schwellenwert von stdout ist nicht auf Debug; der Schwellenwert von Appendern hat Vorrang vor dem des Logger Levels.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X