Deshabilitar la salida de Log4J en Java

87

¿Cómo se pueden apagar rápidamente todas las salidas de Log4J usando un log4j.propertiesarchivo?

cmcginty
fuente

Respuestas:

122

Establezca el nivel en OFF (en lugar de DEBUG, INFO, ....)

Edwin
fuente
79

Si desea desactivar el registro mediante programación, utilice

List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
    logger.setLevel(Level.OFF);
}
Andrew Gilmartin
fuente
5
Especificó "usar un archivo log4j.properties" de todos modos, es muy útil.
Jaime Hablutzel
1
Gracias, justo lo que quería.
Jose Martinez
¿Y cómo revierte los registradores a la configuración anterior (mediante programación)?
Sachin Sharma
Sin magia, solo programación simple. Almacene el nivel actual en un mapa <Logger, Level> en un contexto de larga duración y luego revierte iterando sobre el conjunto de entradas llamando a e.getKey (). SetLevel (e.getValue ())
Andrew Gilmartin
48
 log4j.rootLogger=OFF
flybywire
fuente
14

Puede cambiar el nivel a APAGADO, lo que debería eliminar todos los registros. Según el sitio web log4j, los niveles válidos en orden de importancia son TRACE, DEBUG, INFO, WARN, ERROR, FATAL. Hay un nivel indocumentado llamado APAGADO que es un nivel más alto que FATAL y apaga todos los registros.

También puede crear un registrador raíz adicional para no registrar nada (nivel APAGADO), de modo que pueda cambiar fácilmente los registradores raíz. Aquí hay una publicación para que comiences con eso.

Es posible que también desee leer las preguntas frecuentes de Log4J, porque creo que desactivar todos los registros puede no ser de ayuda. Ciertamente no acelerará tanto su aplicación, porque el código de registro se ejecuta de todos modos, hasta el punto en que log4j decide que no necesita registrar esta entrada.

Rolf
fuente
Y debajo de TRACE está el "nivel" TODOS, lo que es todo lo contrario. En segundo lugar, podría ser más rápido si el programa hace algo como "if (logger.isDebugEnabled ()) logger.debug (...)"
Tim Büthe
El OP no menciona el rendimiento como la razón para querer desactivar todos los registros. Cuando he necesitado hacer esto, es porque muchas bibliotecas sufren de una especie de disentería de registro, que no produce información útil y quiero una forma abreviada de manejarlo.
Mark Slater
4

Cambia de nivel a lo que quieras. (Estoy usando Log4j2, versión 2.6.2). Esta es la forma más sencilla, cambie a<Root level="off">

Por ejemplo: entorno de desarrollo de archivoslog4j2.xml

<?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>

Entorno de producción

<?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>
Do Nhu Vy
fuente
4

Además, también es posible desactivar el cierre de sesión mediante programación:

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

O

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

Estos utilizan importaciones:

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.NullAppender;
maytham-ɯɐɥʇʎɐɯ
fuente
1
Esta es la mejor solución para aplicaciones independientes que no deberían registrar nada.
basZero