131 votes

Pourquoi les messages de journalisation Level.FINE ne s'affichent-ils pas ?

El JavaDocs pour java.util.logging.Level l'État :


Les niveaux, par ordre décroissant, sont les suivants :

  • SEVERE (valeur la plus élevée)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (valeur la plus basse)

Source :

import java.util.logging.*;

class LoggingLevelsBlunder {

    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        logger.setLevel(Level.FINER);
        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}

Sortie

Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .

Exposé du problème

Dans mon exemple, le Level a FINER Je m'attendais donc à voir deux messages pour chaque boucle. Au lieu de cela, je vois un seul message pour chaque boucle (le message Level.FINE sont manquants).

Question

Qu'est-ce qui doit changer pour que le FINE (, FINER o FINEST ) ?

Mise à jour (solution)

Merci à La réponse de Vineet Reynolds Cette version fonctionne conformément à mes attentes. Il affiche 3 x INFO messages, & 3 x FINE messages.

import java.util.logging.*;

class LoggingLevelsBlunder {

    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        // LOG this level to the log
        logger.setLevel(Level.FINER);

        ConsoleHandler handler = new ConsoleHandler();
        // PUBLISH this level
        handler.setLevel(Level.FINER);
        logger.addHandler(handler);

        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}

12 votes

Il me semble que vous aurez les messages imprimés deux fois sur la console pour INFO et au-dessus : d'abord par le logger anonyme, puis par son parent, le logger global qui a aussi un ConsoleHandler réglé sur INFO par défaut. Pour désactiver le logger global, vous devez ajouter cette ligne de code : logger.setUseParentHandlers(false) ;

0 votes

Je veux juste confirmer le commentaire de mins sur les doubles. Vous obtiendrez deux sorties à moins que vous n'utilisiez .setUseParentHandlers(false) ;

0 votes

Dans votre solution, bûcheron a deux Handlers (un par défaut à INFO et un ajouté à FINE), donc logger.info("quelque chose") s'imprimerait deux fois

0voto

Alex R Points 2372

J'ai trouvé mon problème réel et il n'a été mentionné dans aucune réponse : certains de mes tests unitaires faisaient en sorte que le code d'initialisation de la journalisation était exécuté plusieurs fois dans la même suite de tests, ce qui perturbait la journalisation des tests ultérieurs.

0voto

user2627331 Points 33

Cette solution me semble meilleure, en ce qui concerne la maintenabilité et la conception pour le changement :

  1. Créez le fichier de propriété de journalisation en l'incorporant dans le dossier du projet de ressources, à inclure dans le fichier jar :

    # Logging
    handlers = java.util.logging.ConsoleHandler
    .level = ALL
    
    # Console Logging
    java.util.logging.ConsoleHandler.level = ALL
  2. Charger le fichier de propriété à partir du code :

    public static java.net.URL retrieveURLOfJarResource(String resourceName) {
       return Thread.currentThread().getContextClassLoader().getResource(resourceName);
    }
    
    public synchronized void initializeLogger() {
       try (InputStream is = retrieveURLOfJarResource("logging.properties").openStream()) {
          LogManager.getLogManager().readConfiguration(is);
       } catch (IOException e) {
          // ...
       }
    }

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