Desativando Log4J Output em Java

87

Como alguém pode desligar rapidamente toda a saída do Log4J usando um log4j.propertiesarquivo?

cmcginty
fonte

Respostas:

120

Defina o nível como OFF (em vez de DEBUG, INFO, ....)

Edwin
fonte
79

Se você deseja desligar o registro de forma programática, use

List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
    logger.setLevel(Level.OFF);
}
Andrew Gilmartin
fonte
5
Ele especificou "usando um arquivo log4j.properties" de qualquer maneira, é muito útil.
Jaime Hablutzel
1
Obrigado, exatamente o que eu queria.
Jose Martinez de
E como você reverte os registradores para a configuração anterior (programaticamente)?
Sachin Sharma,
Sem mágica, apenas programação simples. Armazene o nível atual em um Map <Logger, Level> em um contexto de longa duração e, em seguida, reverta iterando sobre o conjunto de entrada chamando e.getKey (). SetLevel (e.getValue ())
Andrew Gilmartin
48
 log4j.rootLogger=OFF
flybywire
fonte
14

Você pode alterar o nível para OFF, o que deve eliminar todos os registros. De acordo com o site log4j, os níveis válidos em ordem de importância são TRACE, DEBUG, INFO, WARN, ERROR, FATAL. Há um nível não documentado chamado OFF, que é um nível superior ao FATAL e desativa todo o registro.

Você também pode criar um logger de root extra para não registrar nada (nível OFF), para que possa alternar facilmente os loggers de root. Aqui está uma postagem para você começar.

Você também pode querer ler o FAQ do Log4J, porque acho que desligar todos os logs pode não ajudar. Certamente não acelerará tanto o seu aplicativo, porque o código de registro é executado de qualquer maneira, até o ponto em que o log4j decide que não precisa registrar essa entrada.

Rolf
fonte
E embaixo de TRACE está o "nível" TODOS, o que é mais ou menos o oposto. Em segundo lugar, poderia ser mais rápido se o programa fizesse algo como "if (logger.isDebugEnabled ()) logger.debug (...)"
Tim Büthe
O OP não menciona o desempenho como o motivo para querer desligar todo o registro. Quando precisei fazer isso, é porque muitas bibliotecas sofrem de um tipo de disenteria de registro, que não produz informações úteis e eu quero uma maneira abreviada de lidar com isso.
Mark Slater,
4

Mude o nível para o que você deseja. (Estou usando Log4j2, versão 2.6.2). Esta é a maneira mais simples, mude para<Root level="off">

Por exemplo: ambiente de desenvolvimento de arquivoslog4j2.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>

Ambiente de produção

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

Além disso, também é possível desativar o log de forma programática:

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

Ou

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

Eles usam importações:

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.NullAppender;
maytham-ɯɐɥʇʎɐɯ
fonte
1
Esta é a melhor solução para aplicativos autônomos que não devem registrar nada.
basZero