我想向正在处理的类中添加一些log.debug语句,并且希望在运行测试时在输出中看到它。我想在命令行上覆盖log4j属性,如下所示:
-Dlog4j.logger.com.mypackage.Thingie=DEBUG
我经常做这种事情。我只对在命令行中传递它的方式感兴趣。我知道如何使用配置文件进行操作,但这不适合我的工作流程。
Answers:
log4j不直接支持此功能。
由于您不需要配置文件,因此您很可能使用编程配置。我建议您考虑扫描所有系统属性,并根据此内容显式编程所需的内容。
作为jvm参数的一部分,可以设置-Dlog4j.configuration=file:"<FILE_PATH>"
。其中FILE_PATH是log4j.properties文件的路径。
请注意,从log4j2开始,要使用的新系统变量是log4j.configurationFile
您放入文件的实际路径(即不带file:
前缀),它将根据配置文件的扩展名自动加载工厂:
-Dlog4j.configurationFile=/path/to/log4jconfig.{ext}
这些答案实际上使我无法尝试最简单的方法!只需log4j.configuration
像这样指定一个附加器(例如“控制台”)的阈值即可:
log4j.appender.console.threshold=${my.logging.threshold}
然后,在命令行上包含system属性-Dlog4j.info -Dmy.logging.threshold=INFO
。我假定可以通过这种方式对任何其他属性进行参数化,但这是在全球范围内提高或降低日志记录级别的最简单方法。
Loggers:\n Logger:\n name: stuff \n level: ${sys:my.log.level:-INFO}
使用Log4j2,可以通过将以下实用程序方法添加到您的代码中来实现。
private static void setLogLevel() {
if (Boolean.getBoolean("log4j.debug")) {
Configurator.setLevel(System.getProperty("log4j.logger"), Level.DEBUG);
}
}
您需要这些进口
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
现在,setLogLevel
在main()或任何合适的地方调用方法,并传递命令行参数-Dlog4j.logger=com.mypackage.Thingie
和-Dlog4j.debug=true
。
根据ThorbjørnRavn Andersens的建议,我编写了一些使此工作有效的代码
在main方法的早期添加以下内容,现在可以从comand行设置日志级别。这已经在我的一个项目中进行了测试,但是我是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);
}
}
基于@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);
}
}
}