web-dev-qa-db-fra.com

Comment puis-je désactiver le gestionnaire de console par défaut lors de l'utilisation de l'API de journalisation Java?

Bonjour, j'essaie d'implémenter la Java en journalisant mon application. Je veux utiliser deux gestionnaires. Un gestionnaire de fichiers et mon propre gestionnaire de console. Mes deux gestionnaires fonctionnent correctement. Ma journalisation est envoyée à un fichier et la console. Ma journalisation est également envoyée au gestionnaire de console par défaut, ce que je ne veux pas. Si vous exécutez mon code, deux lignes supplémentaires sont envoyées à la console. Je ne souhaite pas utiliser la console par défaut Quelqu'un sait-il comment désactiver le gestionnaire de console par défaut? Je souhaite uniquement utiliser les deux gestionnaires que j'ai créés.

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. ??");
    }
}
88
loudiyimo

Le gestionnaire de console par défaut est associé au consignateur racine, qui est le parent de tous les autres consignateurs, y compris le vôtre. Je vois donc deux manières de résoudre votre problème:

Si cela n’affecte que votre classe, la solution la plus simple serait de désactiver la transmission des journaux au consignateur parent:

logger.setUseParentHandlers(false);

Si vous souhaitez modifier ce comportement pour l'ensemble de votre application, vous pouvez supprimer complètement le gestionnaire de console par défaut de l'enregistreur racine avant d'ajouter vos propres gestionnaires:

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

Remarque: si vous souhaitez également utiliser les mêmes gestionnaires de journaux dans d'autres classes, le meilleur moyen consiste à déplacer la configuration du journal dans un fichier de configuration à long terme.

99
Péter Török

Il suffit de faire

LogManager.getLogManager().reset();
105
Dominique

C'est étrange mais Logger.getLogger("global") ne fonctionne pas dans ma configuration (ainsi que Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

Cependant Logger.getLogger("") fait bien le travail.

J'espère que cette information aide aussi quelqu'un ...

19
Dime

Effectuez une réinitialisation de la configuration et définissez le niveau racine sur OFF.

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

Vous devez indiquer à votre consignateur de ne pas envoyer ses messages à son consignateur parent:

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

Cependant, cela devrait être fait avant d'ajouter d'autres gestionnaires à l'enregistreur.

5
JustSayin