Ich verwende log4j, um Fehler und andere Systeminformationen zu protokollieren. Aber kommen Sie von den Informationen, die zweimal auf INFO-Ebene protokolliert wurden.
public static void main(final String... args) throws Exception {
LOGGER.info("program started");
try {
// try body codes
} catch (Exception ex) {
LOGGER.info("program start-up failed.",ex);
}
}
Wenn das Programm jedoch die zweimal protokollierten Informationen startet oder fehlschlägt, kann mir jeder helfen, den Grund dafür zu finden.
Antworten:
Es sieht so aus, als würden Ihre Nachrichten einmal vom Root-Logger und erneut vom jeweiligen Logger protokolliert, da möglicherweise beide Appender konfiguriert sind (möglicherweise an verschiedenen Stellen - in einer Eigenschaftendatei und dann im Code).
Dies kann behoben werden, indem Sie die Additivität in Ihrem Logger auf false setzen. Das Log4j- Handbuch erwähnt die Additivität im Abschnitt Anhänge und Layout. Überprüfen Sie dies
quelle
log4j
Stimmen Sie mit atlantis überein.
Die obigen Eigenschafteneinstellungen führen zu einer doppelten Protokollierung.
Jedoch hinzufügen
Das Problem wurde behoben.
Lesen Sie Seite 62 dieses Buches. http://books.google.com/books?id=hZBimlxiyAcC&printsec=frontcover#v=onepage&q&f=false
quelle
Für diejenigen, die das XML-Format verwenden:
Hinweis: Standardmäßig ist für Logger das Additivitätsflag auf true gesetzt.
quelle
Einfach hinzufügen
zu Ihrem Code ( Referenz ).
Wir haben doppelte Ergebnisse in der Konsole, weil Appender keine Singletons sind, sondern additiv. Das heißt, eine Kategorie erbt alle Appender von ihren Vorfahren (standardmäßig). Wenn wir einer Kategorie einen Appender hinzufügen und dieser in denselben zugrunde liegenden Stream (Konsole, dieselbe Datei usw.) wie ein anderer Appender schreibt, wird dieselbe Protokollmeldung zweimal (oder öfter) im Protokoll angezeigt. Wenn zwei Kategorien in einer Hierarchie so konfiguriert sind, dass sie denselben Appendernamen verwenden, schreibt Log4j außerdem zweimal in diesen Appender. Für diese Kategorie konfiguriert
quelle
setAdditivity()
mehr.Wenn Sie das Programm mit einem Java-Debugger ausführen können, setzen Sie einen Haltepunkt in das Programm, an dem einer dieser doppelten Protokollierungsaufrufe auftritt.
Untersuchen Sie das Logger-Objekt im Debugger. Wenn es sich um einen org.apache.log4j.Logger (v 1.2.x) handelt, verfügt er möglicherweise über einen AppenderAttachableImpl. Sie können AppenderAttachableImpl nach der Appender-Liste abfragen.
Wenn Sie mehr als einen Appender finden, könnte dies das Problem sein - und ein Hinweis darauf, es zu beheben.
quelle
Ich hatte das gleiche Problem und wurde behoben, indem alle Appender aus dem Root-Logger entfernt wurden. Ich weiß nicht warum, aber ich löse mein Problem und teile:
Ohne diese zusätzliche Zeile wird die Additivität sogar auf false gesetzt, wenn ich mich mit meinem csvLogger oder txtLogger anmelde, wird zweimal protokolliert.
quelle
Eine mögliche Alternative zum Anpassen der
additivity
Eigenschaft besteht darin, Ihre Logger von den spezifischsten bis zu den allgemeinsten zu untersuchen. Im folgenden Beispiel wird eine doppelte Protokollierung in der Konsole für alle in foo.bar.LoggingExampleClass auftretenden Protokollereignisse erwartet. Es ist sicher, den zusätzlichen Konsolen-Appender aus dem foo.bar.LoggingExampleClass-Logger zu entfernen, da er bereits vom Root-Logger abgedeckt wird.Es gibt Kompromisse sowohl beim Additivitätsanpassungsansatz als auch beim Appenderanpassungsansatz. Durch Deaktivieren der Additivität wird möglicherweise versehentlich verhindert, dass der Appender eines gewünschten generischen Loggers verwendet wird. Im obigen Beispiel würde das Festlegen der
additivity="false"
Eigenschaft im foo.bar.LoggingExampleClass-Logger bedeuten, dass das Protokollierungsereignis nicht an die MainLogFile angehängt wird, auf die im Root-Logger verwiesen wird.Andererseits kann es problematisch sein, sich auf übergeordnete Appender zu verlassen, wenn die übergeordneten Appender geändert werden, ohne die Auswirkungen auf detailliertere Logger zu untersuchen. Angenommen, die Protokollierungsereignisse foo.bar.LoggingExampleClass müssen in die Konsole geschrieben werden. Sie befinden sich derzeit aufgrund der Additivität in der obigen Beispielkonfiguration, auch wenn der Konsolen-Appender von foo.bar.LoggingExampleClass Logger entfernt wurde. Wenn der Konsolen-Appender jedoch auch ohne zusätzliche Anpassungen aus dem Root-Logger entfernt würde, wäre die Anforderung nicht mehr erfüllt.
quelle
Dies ist eine weitere Option, wenn Sie die Funktion "Additivität" nicht verwenden möchten.
In meinem Fall (und meistens auch in Ihrem Fall) befindet sich der Root-Logger hinter diesem zusätzlichen Protokoll, und Sie haben einen anderen höheren Logger in Ihren Konfigurationen, so etwas
Dies führt zu doppelten Protokollen. Wenn Sie den Root-Logger überhaupt aus dieser Konfigurationsdatei entfernt haben,
log4j
wird der Standard-Root-Logger erzwungen. Überprüfen Sie diesen HinweisWenn Sie den Standard-Root-Logger überschreiben und erzwingen möchten, dass er nicht protokolliert wird , können Sie den Appender wie folgt aus Ihrer Konfigurationsdatei entfernen
Dies ist nur eine weitere Option. Ich verwende jedoch gerne die empfohlene Methode und setze das Attribut "Additivität" auf den untergeordneten Logger
quelle
In deiner
resources/log4.properties
Datei.Wenn Sie in dieser Konfigurationsdatei "
log4j.rootLogger= DEBUG, file
" haben, schließen Sie "log4j.logger.org.springframework=DEBUG, file
" nicht ein. Behalten Sie einfach den log4j.rootLogger-Teil.quelle