我想在我正在处理的类中添加一些log.debug语句,并且我希望在运行测试时在输出中看到它.我想在命令行上覆盖log4j属性,如下所示:
-Dlog4j.logger.com.mypackage.Thingie=DEBUG
Run Code Online (Sandbox Code Playgroud)
我经常这样做.我特别感兴趣的是在命令行上传递它的方法.我知道如何使用配置文件来完成它,这不适合我的工作流程.
Anu*_*s05 44
作为jvm参数的一部分,您可以设置-Dlog4j.configuration=file:"<FILE_PATH>".其中FILE_PATH是log4j.properties文件的路径.
请注意,从log4j2开始,要使用的新系统变量是log4j.configurationFile你输入文件的实际路径(即没有file:前缀),它将根据配置文件的扩展名自动加载工厂:
-Dlog4j.configurationFile=/path/to/log4jconfig.{ext}
Run Code Online (Sandbox Code Playgroud)
Abu*_*sar 28
这些答案实际上阻止了我尝试最简单的事情!只需在您的log4j.configuration喜欢中指定一个appender(例如"console")的阈值即可:
log4j.appender.console.threshold=${my.logging.threshold}
Run Code Online (Sandbox Code Playgroud)
然后,在命令行上包含系统属性-Dlog4j.info -Dmy.logging.threshold=INFO.我假设任何其他属性都可以通过这种方式进行参数化,但这是提高或降低全局日志记录级别的最简单方法.
Neo*_*Neo 12
使用Log4j2,可以使用添加到代码中的以下实用程序方法来实现.
private static void setLogLevel() {
if (Boolean.getBoolean("log4j.debug")) {
Configurator.setLevel(System.getProperty("log4j.logger"), Level.DEBUG);
}
}
Run Code Online (Sandbox Code Playgroud)
你需要这些进口
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
Run Code Online (Sandbox Code Playgroud)
现在调用setLogLevelmain()或者适当的方法中的方法并传递命令行参数-Dlog4j.logger=com.mypackage.Thingie和-Dlog4j.debug=true.
根据ThorbjørnRavnAndersens的建议,我写了一些使这项工作的代码
在main方法的早期添加以下内容,现在可以从命令行设置日志级别.这已在我的一个项目中测试过,但我是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);
}
}
Run Code Online (Sandbox Code Playgroud)
在我非常标准的设置中,当作为 VM 选项(Java 中的类之前的命令行,或 IDE 中的 VM 选项)传入时,我一直看到以下效果很好:
-Droot.log.level=TRACE
Run Code Online (Sandbox Code Playgroud)