2017-08-31 5 views
0

J'ai une application pour laquelle je souhaite que le niveau de consignation soit défini sur INFO, sauf si le mode Débogage est défini, auquel cas je souhaite définir le niveau sur FINEST.Est-il possible de remplacer les valeurs définies dans le fichier de propriétés pour java.util.logging par programmation?

Si je définis le niveau dans le fichier de propriétés, il ne sera pas outrepassé du programme en utilisant logger.setLevel(Level.FINEST) également, si je ne définis rien pour le champ .level dans le fichier de propriétés, le niveau INFO est pris par défaut et ne peut pas remplacer pour utiliser FINEST si isDebugEnable().

Comment est-ce que je peux configurer ce niveau en fonction de la condition?

try(InputStream configFile = getClass().getClassLoader().getResourceAsStream("logging.properties")) { 
     LogManager.getLogManager().readConfiguration(configFile); 
    } catch (IOException e) { 
     throw new IllegalStateException("Unable to load default logging properties.", e); 
    } 
if (isDebugEnabled()) { 
     logger.setLevel(Level.FINEST); 
    } else { 
     logger.setLevel(Level.INFO); 
    } 

Mon fichier de configuration est la suivante:

handlers= java.util.logging.ConsoleHandler 
.level= INFO 

# default file output is in user's home directory. 
java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

# Enable console to set level to FINEST and above. 
java.util.logging.ConsoleHandler.level = FINEST 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

Je peux le faire en utilisant comme suivre, mais je voudrais savoir s'il y a une meilleure façon de le faire. (Peut être propriétés en utilisant le fichier)

ConsoleHandler consoleHandler = new ConsoleHandler(); 
setLogLevel(); 
consoleHandler.setLevel(Level.FINEST); 
logger.addHandler(new ConsoleHandler()); 
+0

Copie possible de [Java - modifier dynamiquement le niveau de consignation] (https://stackoverflow.com/questions/13760095/java-dynamically-change-logging-level) – Avinash

Répondre

1

Si vous configurez une option DEBUG avant le démarrage de la machine virtuelle Java puis emballer juste un 2ème fichier logging.properties appelé debug.properties et changer le java.util.logging.config.file pour pointer vers le debug.properties lorsque vous voulez des options de débogage.

handlers= java.util.logging.ConsoleHandler 
.level= FINEST 

# default file output is in user's home directory. 
java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.level = ALL 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

# Enable console to set level to show all levels. 
java.util.logging.ConsoleHandler.level = ALL 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

Si vous devez définir les niveaux lors de l'exécution vous tomberez pour des problèmes avec readConfiguration not resetting all everything after boot of the JVM. Sous JDK 8 ou plus, tout ce que vous pouvez faire est d'appeler readConfiguration pour remplir les valeurs par défaut et ajouter plus de code pour corriger le comportement brisé. Puisque vous avez juste besoin de définir le niveau sur les gestionnaires, il suffit d'ajouter ce code.

try(InputStream configFile = getClass().getClassLoader().getResourceAsStream("logging.properties")) { 
    LogManager.getLogManager().readConfiguration(configFile); 
} catch (IOException e) { 
    throw new IllegalStateException("Unable to load default logging properties.", e); 
} 

Level lvl; 
if (isDebugEnabled()) { 
    lvl = Level.FINEST; 
} else { 
    lvl = Level.INFO; 
} 
logger.setLevel(lvl); 
for(Handler h : logger.getHandlers()) { 
    h.setLevel(lvl); 
} 

9 fournit une JDK méthode updateConfiguration qui fonctionnera autour du comportement défectueux de la méthode readConfiguration.