Disabilitazione dell'output di Log4J in Java


87

Come si può disattivare rapidamente tutto l' output di Log4J utilizzando un log4j.propertiesfile?

Risposte:


122

Imposta il livello su OFF (invece di DEBUG, INFO, ....)


79

Se si desidera disattivare la registrazione a livello di codice, utilizzare

List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
    logger.setLevel(Level.OFF);
}

5
Ha specificato che "usare un file log4j.properties" è comunque molto utile.
Jaime Hablutzel

1
Grazie, proprio quello che volevo.
Jose Martinez

E come si ripristinano i logger all'impostazione precedente (a livello di programmazione)?
Sachin Sharma

Nessuna magia, solo semplice programmazione. Memorizza il livello corrente in una mappa <Logger, Level> in un contesto di lunga durata e quindi ripristina iterando sul set di voci chiamando e.getKey (). SetLevel (e.getValue ())
Andrew Gilmartin


14

È possibile modificare il livello su OFF in modo da eliminare tutte le registrazioni. Secondo il sito web log4j, i livelli validi in ordine di importanza sono TRACE, DEBUG, INFO, WARN, ERROR, FATAL. C'è un livello non documentato chiamato OFF che è un livello più alto di FATAL e disattiva tutte le registrazioni.

Puoi anche creare un logger di root aggiuntivo per non registrare nulla (livello OFF), in modo da poter cambiare facilmente i logger di root. Ecco un post per iniziare a farlo.

Potresti anche leggere le FAQ di Log4J, perché penso che disattivare tutti i log potrebbe non essere d'aiuto. Certamente non velocizzerà più di tanto la tua app, perché il codice di registrazione viene eseguito comunque, fino al punto in cui log4j decide che non è necessario registrare questa voce.


E sotto TRACE c'è il "livello" ALL, che è il contrario. In secondo luogo, potrebbe essere più veloce se il programma facesse qualcosa come "if (logger.isDebugEnabled ()) logger.debug (...)"
Tim Büthe

L'OP non menziona le prestazioni come motivo per voler disattivare tutte le registrazioni. Quando ho avuto bisogno di farlo, è perché molte biblioteche soffrono di una sorta di dissenteria da registrazione, che non produce informazioni utili e voglio un modo breve per gestirla.
Mark Slater

4

Cambia livello a quello che vuoi. (Sto usando Log4j2, versione 2.6.2). Questo è il modo più semplice, passare a<Root level="off">

Ad esempio: ambiente di sviluppo filelog4j2.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 di produzione

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

4

Inoltre, è anche possibile disattivare la registrazione a livello di codice:

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

O

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

Questi usano le importazioni:

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.NullAppender;

1
Questa è la soluzione migliore per le app autonome che non dovrebbero registrare nulla.
basZero
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.