Ich möchte einer Klasse, an der ich arbeite, einige log.debug-Anweisungen hinzufügen, und ich möchte dies beim Ausführen des Tests in der Ausgabe sehen. Ich möchte die log4j-Eigenschaften in der Befehlszeile folgendermaßen überschreiben:
-Dlog4j.logger.com.mypackage.Thingie=DEBUG
Ich mache so etwas häufig. Ich bin speziell nur an einer Möglichkeit interessiert, dies auf der Kommandozeile zu übergeben. Ich weiß, wie man es mit einer Konfigurationsdatei macht, und das passt nicht zu meinem Workflow.
Diese Antworten haben mich tatsächlich davon abgehalten, das Einfachste zu versuchen! Geben Sie einfach einen Schwellenwert für eine appender (sagen wir, „Konsole“) in der in
log4j.configuration
etwa so:Fügen Sie dann in der Befehlszeile die Systemeigenschaft ein
-Dlog4j.info -Dmy.logging.threshold=INFO
. Ich gehe davon aus, dass jede andere Eigenschaft auf diese Weise parametrisiert werden kann, aber dies ist der einfachste Weg, um die Protokollierungsstufe global zu erhöhen oder zu senken.quelle
Loggers:\n Logger:\n name: stuff \n level: ${sys:my.log.level:-INFO}
Mit Log4j2 kann dies mithilfe der folgenden Dienstprogrammmethode erreicht werden, die Ihrem Code hinzugefügt wurde.
private static void setLogLevel() { if (Boolean.getBoolean("log4j.debug")) { Configurator.setLevel(System.getProperty("log4j.logger"), Level.DEBUG); } }
Sie benötigen diese Importe
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator;
setLogLevel
Rufen Sie nun die Methode in main () oder gegebenenfalls auf und übergeben Sie die Befehlszeilenparameter-Dlog4j.logger=com.mypackage.Thingie
und-Dlog4j.debug=true
.quelle
Basierend auf dem Vorschlag von Thorbjørn Ravn Andersens habe ich einen Code geschrieben, mit dem dies funktioniert
Fügen Sie Folgendes früh in die Hauptmethode ein, und es ist jetzt möglich, die Protokollstufe über die Befehlszeile festzulegen. Dies wurde in einem meiner Projekte getestet, aber ich bin neu in log4j und habe möglicherweise einen Fehler gemacht. Wenn ja, bitte korrigieren Sie mich.
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); } }
quelle
In meinem hübschen Standard-Setup habe ich Folgendes gut gesehen, wenn es als VM Option übergeben wurde (Befehlszeile vor dem Unterricht in Java oder VM Option in einer IDE):
quelle
Basierend auf @lijat ist hier eine vereinfachte Implementierung. In meiner frühlingsbasierten Anwendung lade ich diese einfach als Bohne.
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); } } }
quelle