web-dev-qa-db-fra.com

Comment définir le niveau de 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. Je voudrais remplacer les propriétés log4j sur la ligne de commande, avec quelque chose comme:

-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 passer cela en ligne de commande. Je sais comment faire avec un fichier de configuration, et cela ne convient pas à mon flux de travail.

61
Kevin Peterson

log4j ne supporte pas cela directement.

Comme vous ne voulez pas de fichier de configuration, vous utilisez probablement une configuration par programme. Je suggérerais que vous examiniez toutes les propriétés du système et que vous programmiez explicitement ce que vous voulez en fonction de cela.

12

Dans le cadre de vos arguments jvm, vous pouvez définir -Dlog4j.configuration=file:"<FILE_PATH>". Où FILE_PATH est le chemin de votre fichier log4j.properties.

Veuillez noter qu'à partir de log4j2 , la nouvelle variable système à utiliser est log4j.configurationFile et vous indiquez le chemin d'accès réel au fichier (c'est-à-dire sans le file: _ préfixe) et chargera automatiquement l’usine en fonction de l’extension du fichier de configuration:

-Dlog4j.configurationFile=/path/to/log4jconfig.{ext}
44
Anubis05

Ces réponses m'ont effectivement dissuadé d'essayer la chose la plus simple possible! Spécifiez simplement un seuil pour un ajout (par exemple, "console") dans votre log4j.configuration ainsi:

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 qu’il s’agit du moyen le plus simple d’augmenter ou de réduire le niveau de journalisation de manière globale.

27
AbuNassar

Avec Log4j2, cela peut être réalisé à l'aide de 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;

Maintenant, invoquez la méthode 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.

11
Neo

Sur la suggestion de Thorbjørn Ravn Andersens, j’ai écrit du code qui rend ce travail

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 commis 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);
        }
    }
6
lijat

Basé sur @lijat, voici une implémentation simplifiée. Dans mon application basée sur le printemps, je charge simplement ceci comme un haricot.

public static void configureLog4jFromSystemProperties()
{
  final String LOGGER_PREFIX = "log4j.logger.";

  for(String propertyName : System.getProperties().stringPropertyNames())
  {
    if (propertyName.startsWith(LOGGER_PREFIX)) {
      String loggerName = propertyName.substring(LOGGER_PREFIX.length());
      String levelName = System.getProperty(propertyName, "");
      Level level = Level.toLevel(levelName); // defaults to DEBUG
      if (!"".equals(levelName) && !levelName.toUpperCase().equals(level.toString())) {
        logger.error("Skipping unrecognized log4j log level " + levelName + ": -D" + propertyName + "=" + levelName);
        continue;
      }
      logger.info("Setting " + loggerName + " => " + level.toString());
      Logger.getLogger(loggerName).setLevel(level);
    }
  }
}
2
Chris Noe

Dans ma jolie configuration standard, j’ai bien constaté que les opérations suivantes fonctionnaient bien lorsque elles étaient passées sous la forme VM Option (ligne de commande avant la classe en Java, ou VM Option dans un IDE):

-Droot.log.level=TRACE
1
Rob Dawson