Deaktivieren der Log4J-Ausgabe in Java

87

Wie kann man alle Log4J- Ausgaben mithilfe einer log4j.propertiesDatei schnell ausschalten ?

cmcginty
quelle

Antworten:

120

Stellen Sie den Pegel auf OFF (anstelle von DEBUG, INFO, ....)

Edwin
quelle
79

Wenn Sie die Protokollierung programmgesteuert deaktivieren möchten, verwenden Sie

List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
    logger.setLevel(Level.OFF);
}
Andrew Gilmartin
quelle
5
Er hat "using a log4j.properties file" angegeben, trotzdem ist es sehr nützlich.
Jaime Hablutzel
1
Danke, genau das, was ich wollte.
Jose Martinez
Und wie können Sie die Logger auf die vorherige Einstellung zurücksetzen (programmgesteuert)?
Sachin Sharma
Keine Magie, nur einfache Programmierung. Speichern Sie die aktuelle Ebene in einer Map <Logger, Ebene> in einem langlebigen Kontext und kehren Sie dann zurück, indem Sie über den Eintragssatz iterieren, der e.getKey () aufruft. SetLevel (e.getValue ())
Andrew Gilmartin
48
 log4j.rootLogger=OFF
Flybywire
quelle
14

Sie können den Pegel auf AUS ändern, um alle Protokollierungen zu entfernen. Laut der log4j-Website sind gültige Werte in der Reihenfolge ihrer Wichtigkeit TRACE, DEBUG, INFO, WARN, ERROR, FATAL. Es gibt eine undokumentierte Ebene namens OFF, die höher als FATAL ist und die gesamte Protokollierung deaktiviert.

Sie können auch einen zusätzlichen Root-Logger erstellen, um nichts zu protokollieren (Stufe AUS), sodass Sie Root-Logger einfach wechseln können. Hier ist ein Beitrag , mit dem Sie beginnen können.

Vielleicht möchten Sie auch die Log4J-FAQ lesen , da ich denke , dass das Deaktivieren der gesamten Protokollierung möglicherweise nicht hilft. Es wird Ihre App sicherlich nicht so sehr beschleunigen, da der Protokollierungscode ohnehin ausgeführt wird, bis zu dem Punkt, an dem log4j entscheidet, dass dieser Eintrag nicht protokolliert werden muss.

Rolf
quelle
Und unter TRACE befindet sich das "Level" ALL, was genau das Gegenteil ist. Zweitens könnte es schneller sein, wenn das Programm so etwas wie "if (logger.isDebugEnabled ()) logger.debug (...)" ausführt
Tim Büthe
Das OP nennt die Leistung nicht als Grund dafür, dass die gesamte Protokollierung deaktiviert werden soll. Wenn ich dies tun musste, liegt es daran, dass viele Bibliotheken unter einer Art Protokollierungsruhr leiden, die keine nützlichen Informationen hervorbringt, und ich möchte eine kurze Möglichkeit, damit umzugehen.
Mark Slater
4

Ändern Sie das Level auf das, was Sie wollen. (Ich verwende Log4j2, Version 2.6.2). Dies ist der einfachste Weg, wechseln Sie zu<Root level="off">

Zum Beispiel: Datei - log4j2.xml
Entwicklungsumgebung

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <Console name="SimpleConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="SimpleConsole"/>
        </Root>
    </Loggers>
</Configuration>

Produktionsumgebung

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <Console name="SimpleConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="off">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
    <Loggers>
        <Root level="off">
            <AppenderRef ref="SimpleConsole"/>
        </Root>
    </Loggers>
</Configuration>
Mach Nhu Vy
quelle
4

Darüber hinaus ist es auch möglich, die Abmeldung programmgesteuert zu deaktivieren:

Logger.getRootLogger().setLevel(Level.OFF);

Oder

Logger.getRootLogger().removeAllAppenders();
Logger.getRootLogger().addAppender(new NullAppender());

Diese verwenden Importe:

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.NullAppender;
Maytham-ɯɐɥʇʎɐɯ
quelle
1
Dies ist die beste Lösung für eigenständige Apps, die nichts protokollieren sollten.
BasZero