94 votes

Comment puis-je désactiver le gestionnaire de console par défaut, tout en utilisant l'API de journalisation java?

Bonjour, je suis en train de mettre en œuvre le journal Java dans mon application. Je veux utiliser deux gestionnaires. Un gestionnaire de fichiers et mon propre gestionnaire de console. Les deux gestionnaires fonctionnent bien. Mes journaux sont envoyés à un fichier et à la console. Mes journaux sont également envoyés au gestionnaire de console par défaut, ce que je ne veux pas. Si vous exécutez mon code, vous verrez deux lignes supplémentaires envoyées à la console. Je ne veux pas utiliser le gestionnaire de console par défaut. Est-ce que quelqu'un sait comment désactiver le gestionnaire de console par défaut. Je veux seulement 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("pourquoi mon application de test utilise-t-elle le journal standard de la console ?\n" + "Je veux seulement mon gestionnaire de console (Handler ch)\n" + "comment puis-je désactiver le journal standard de la console. ??");
    }
}

1 votes

Puis-je suggérer gentiment d'utiliser b.append(formatMessage(arg0)) au lieu de b.append(arg0.getMessage()). Avec la méthode formatMessage, vous rendez votre formateur compatible avec l'utilisation de public void log(Level level, String msg, Object param1) et des méthodes similaires.

111voto

Dominique Points 721

Il suffit de

LogManager.getLogManager().reset();

1 votes

Merci, ceci est la bonne réponse. La réponse marquée comme correcte, ne fonctionne pas.

1 votes

Cela devrait indiquer que cela affectera chaque gestionnaire de chaque Logger nommé, ce qui pourrait poser problème pour un système de journalisation plus complexe. Cela devrait être appelé une fois au début du processus pour être sûr que les futurs journaux ne seront pas affectés. Et bien sûr, celui qui aura besoin de la console devra recevoir un ConsoleHandler pour être conforme aux attentes.

104voto

Péter Török Points 72981

Le gestionnaire de console par défaut est attaché au logger racine, qui est un parent de tous les autres loggers, y compris le vôtre. Donc je vois deux façons de résoudre votre problème :

Si cela n'affecte que cette classe particulière, la solution la plus simple serait de désactiver le passage des logs au logger parent :

logger.setUseParentHandlers(false);

Si vous souhaitez changer ce comportement pour l'ensemble de votre application, vous pourriez supprimer le gestionnaire de console par défaut du logger 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 utiliser les mêmes gestionnaires de log dans d'autres classes également, le meilleur moyen est de déplacer la configuration de log dans un fichier de configuration à long terme.

2 votes

La méthode setUseParentHandlers fonctionne, merci. Comment puis-je supprimer le gestionnaire de console par défaut du logger racine ?

0 votes

@loudiyimo vient d'ajouter l'exemple :-)

10 votes

Vous pouvez également utiliser Logger.getLogger("") - cela fonctionne pour moi là où "global" ne fonctionne pas (peut-être en raison de SLF4J dans le mix ?)

20voto

Dime Points 541

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

Cependant Logger.getLogger("") fonctionne bien.

En espérant que ces informations seront utiles à quelqu'un...

3 votes

Quelqu'un peut-il nous dire pourquoi getLogger(Logger.GLOBAL_LOGGER_NAME) ne fonctionne pas mais getLogger("") le fait?

2 votes

@deinocheirus voir mon commentaire à cette réponse

9voto

Manuel Points 21

Effectuez une réinitialisation de la configuration et réglez 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);

5voto

JustSayin Points 21

Vous devez instruire votre enregistreur de ne pas envoyer ses messages à son enregistreur parent :

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

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

0 votes

Cela a fonctionné dans mon cas, même si j'ai dû ajouter manuellement un gestionnaire pour ce journal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X