81 votes

Comment définir le niveau log4j sur la ligne de commande ?

Je souhaite ajouter des instructions log.debug à une classe sur laquelle je travaille et j'aimerais voir cela en sortie lors de l'exécution du test. J'aimerais remplacer les propriétés log4j sur la ligne de commande, avec quelque chose comme ceci :

 -Dlog4j.logger.com.mypackage.Thingie=DEBUG

Je fais ce genre de chose fréquemment. Je ne suis spécifiquement intéressé que par un moyen de le transmettre sur la ligne de commande. Je sais comment le faire avec un fichier de configuration, et cela ne convient pas à mon flux de travail.

36voto

Tony Nassar Points 21

Ces réponses m'ont en fait dissuadé d'essayer la chose la plus simple possible ! Spécifiez simplement un seuil pour un appender (disons, "console") dans votre log4j.configuration comme ceci :

 log4j.appender.console.threshold=${my.logging.threshold}

Ensuite, sur la ligne de commande, incluez la propriété système -Dlog4j.info -Dmy.logging.threshold=INFO . Je suppose que toute autre propriété peut être paramétrée de cette manière, mais c'est le moyen le plus simple d'augmenter ou de réduire le niveau de journalisation globalement.

17voto

Neo Points 2531

Avec Log4j2, cela peut être réalisé en utilisant la méthode utilitaire suivante ajoutée à votre code.

 private static void setLogLevel() {
  if (Boolean.getBoolean("log4j.debug")) {
    Configurator.setLevel(System.getProperty("log4j.logger"), Level.DEBUG);
  }
}

Vous avez besoin de ces importations

 import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;

Appelez maintenant la setLogLevel dans votre main() ou, le cas échéant, et transmettez les paramètres de ligne de commande -Dlog4j.logger=com.mypackage.Thingie et -Dlog4j.debug=true .

16voto

log4j ne prend pas en charge cela directement.

Comme vous ne voulez pas de fichier de configuration, vous utilisez probablement une configuration par programmation. Je vous suggère d'analyser toutes les propriétés du système et de programmer explicitement ce que vous voulez en fonction de cela.

6voto

lijat Points 318

Sur la base de la suggestion de Thorbjørn Ravn Andersens, j'ai écrit un code qui fait que cela fonctionne

Ajoutez ce qui suit au début de la méthode principale et il est maintenant possible de définir le niveau de journalisation à partir de la ligne de commande. Cela a été testé dans un de mes projets, mais je suis nouveau sur log4j et j'ai peut-être fait une erreur. Si c'est le cas, corrigez-moi.

     Logger.getRootLogger().setLevel(Level.WARN);
    HashMap<String,Level> logLevels=new HashMap<String,Level>();
    logLevels.put("ALL",Level.ALL);
    logLevels.put("TRACE",Level.TRACE);
    logLevels.put("DEBUG",Level.DEBUG);
    logLevels.put("INFO",Level.INFO);
    logLevels.put("WARN",Level.WARN);
    logLevels.put("ERROR",Level.ERROR);
    logLevels.put("FATAL",Level.FATAL);
    logLevels.put("OFF",Level.OFF);
    for(String name:System.getProperties().stringPropertyNames()){
        String logger="log4j.logger.";
        if(name.startsWith(logger)){
            String loggerName=name.substring(logger.length());
            String loggerValue=System.getProperty(name);
            if(logLevels.containsKey(loggerValue))
                Logger.getLogger(loggerName).setLevel(logLevels.get(loggerValue));
            else
                Logger.getRootLogger().warn("unknown log4j logg level on comand line: "+loggerValue);
        }
    }

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