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.
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.
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}
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.
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
.
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);
}
}
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);
}
}
}
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