Come posso disabilitare il gestore della console predefinito, mentre utilizzo l'API di registrazione java?


92

Salve, sto cercando di implementare la registrazione java nella mia applicazione. Voglio usare due gestori. Un gestore di file e il mio gestore di console. Entrambi i miei gestori funzionano bene. La mia registrazione viene inviata a un file e alla console. La mia registrazione viene inviata anche al gestore della console predefinito, che non desidero. Se esegui il mio codice vedrai due righe aggiuntive inviate alla console. Non voglio utilizzare il gestore della console predefinito. Qualcuno sa come disabilitare il gestore della console predefinito. Voglio usare solo i due gestori che ho creato.

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LoggingExample {
    private static Logger logger = Logger.getLogger("test");

    static {
        try {
            logger.setLevel(Level.INFO);

            Formatter formatter = new Formatter() {

                @Override
                public String format(LogRecord arg0) {
                    StringBuilder b = new StringBuilder();
                    b.append(new Date());
                    b.append(" ");
                    b.append(arg0.getSourceClassName());
                    b.append(" ");
                    b.append(arg0.getSourceMethodName());
                    b.append(" ");
                    b.append(arg0.getLevel());
                    b.append(" ");
                    b.append(arg0.getMessage());
                    b.append(System.getProperty("line.separator"));
                    return b.toString();
                }

            };

            Handler fh = new FileHandler("test.txt");
            fh.setFormatter(formatter);
            logger.addHandler(fh);

            Handler ch = new ConsoleHandler();
            ch.setFormatter(formatter);
            logger.addHandler(ch);

            LogManager lm = LogManager.getLogManager();
            lm.addLogger(logger);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??");
    }
}

1
Posso suggerire gentilmente di usare al b.append(formatMessage(arg0))posto di b.append(arg0.getMessage()). Con il formatMessagemetodo stai rendendo compatibile il tuo formattatore con l'uso public void log(Level level, String msg, Object param1)e metodi simili.
Victor

Risposte:


102

Il gestore della console predefinito è collegato al logger di root, che è un genitore di tutti gli altri logger, incluso il tuo. Quindi vedo due modi per risolvere il tuo problema:

Se questo riguarda solo questa tua particolare classe, la soluzione più semplice sarebbe disabilitare il passaggio dei log al logger principale:

logger.setUseParentHandlers(false);

Se desideri modificare questo comportamento per l'intera app, puoi rimuovere del tutto il gestore della console predefinito dal logger di root prima di aggiungere i tuoi gestori:

Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

Nota: se si desidera utilizzare gli stessi gestori di log anche in altre classi, il modo migliore è spostare la configurazione del log in un file di configurazione a lungo termine.


2
Il metodo setUseParentHandlers funziona, grazie. come posso rimuovere il gestore della console predefinito dal logger di root?
loudiyimo

10
Potresti anche usare Logger.getLogger ("") - questo funziona per me dove "global" non lo fa (potrebbe essere il risultato di SLF4J nel mix?)
sehugg

2
Se vuoi slf4j ti suggerisco di usare questo LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
Somatik

8
"" è l'identificativo del logger di root. "global" è un logger con nome (figlio di root) che viene creato di default e deve essere usato in scenari di logging semplici
Paolo Fulgoni

1
Questa risposta non funziona per me, ma quella di Dominique

108

Basta fare

LogManager.getLogManager().reset();

1
Grazie, questa è la risposta giusta. La risposta contrassegnata come corretta non funziona.
Andreas L.

1
Questo dovrebbe indicare che ciò avrà un impatto su ogni gestore per ogni nome, Loggerquindi questo potrebbe essere un problema per un sistema di registro più complesso. Questo dovrebbe essere chiamato una volta all'inizio del processo per essere sicuri che il logger futur non verrà influenzato. E, naturalmente, quello che avrà bisogno della console dovrà ricevere un ConsoleHandlerto da come previsto.
AxelH

20

Questo è strano ma Logger.getLogger("global") non funziona nella mia configurazione (così come Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

Comunque Logger.getLogger("")fa bene il lavoro.

Spero che queste informazioni aiutino anche qualcuno ...


3
qualcuno può dirci perché getLogger (Logger.GLOBAL_LOGGER_NAME) non funziona ma getLogger ("") lo fa?
deinocheirus

2
@deinocheirus guarda il mio commento a questa risposta
Paolo Fulgoni

9

Eseguire un ripristino della configurazione e impostare il livello di root su OFF

LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);

5

Devi istruire il tuo logger in modo che non invii i suoi messaggi al logger principale:

...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...

Tuttavia, questo dovrebbe essere fatto prima di aggiungere altri gestori al logger.


Questo ha funzionato nel mio caso, anche se ho dovuto aggiungere manualmente il gestore per questo logger.
Sachin Gorade
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.