如何在命令行上设置log4j级别?

我想添加一些log.debug语句到我正在处理的类,我想在运行testing时看到输出。 我想重写命令行上的log4j属性,如下所示:

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

我经常做这种事。 我特别只对在命令行上传递这个方法感兴趣。 我知道如何使用configuration文件来做到这一点,这不适合我的工作stream程。

log4j不直接支持这个。

由于您不需要configuration文件,因此很可能使用编程configuration。 我build议你看看扫描所有的系统属性,并根据这个明确地编程你想要的。

作为你的jvm参数的一部分,你可以设置-Dlog4j.configuration=file:"<FILE_PATH>" 。 FILE_PATH是你的log4j.properties文件的path。

请注意,从log4j2开始 ,要使用的新系统variables是log4j.configurationFile并且将文件的实际path(即不带file:前缀)放入file: ,并且会根据configuration文件的扩展名自动加载工厂:

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

这些答案实际上阻止了我尝试最简单的事情! 只需在log4j.configuration指定一个appender的阈值(比如“console”),如下所示:

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

然后,在命令行上包含系统属性-Dlog4j.info -Dmy.logging.threshold=INFO 。 我假设任何其他属性都可以用这种方式进行参数化,但是这是提高或降低全局日志logging级别的最简单方法。

基于ThorbjørnRavn Andersens的build议,我写了一些代码,使这项工作

在main方法中尽早添加以下内容,现在可以从命令行设置日志级别。 这已经在我的一个项目中testing过,但我是log4j的新手,可能犯了一些错误。 如果是这样,请纠正我。

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

使用Log4j2,可以使用以下实用程序方法添加到代码中。

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

你需要这些import

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

现在在你的main()或者适当的地方调用setLogLevel方法,并传递命令行params -Dlog4j.logger=com.mypackage.Thingie-Dlog4j.debug=true

基于@lijat,这是一个简化的实现。 在我的基于spring的应用程序中,我简单地把它作为一个bean加载。

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