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

Kev*_*son 62 java log4j

我想在我正在处理的类中添加一些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)

  • 如果它是磁盘上的文件,则需要将"file:"放在路径前面.换句话说... -Dlog4j.configuration = file:<file_path> http://stackoverflow.com/questions/778933/log4j-configuration-via-jvm-arguments (12认同)
  • 实际上在CLASSPATH上搜索FILE_PATH,包括jar文件内部. (3认同)
  • 这如宣传的那样有效;但是我试图覆盖 jar 中属性文件的设置,而后者似乎是在之后设置的。有什么建议吗? (2认同)

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.我假设任何其他属性都可以通过这种方式进行参数化,但这是提高或降低全局日志记录级别的最简单方法.

  • 只是一个小小的改进: yaml `Loggers:\n Logger:\n name: stuff \n level: ${sys:my.log.level:-INFO}` (2认同)

Tho*_*sen 12

log4j不直接支持这个.

由于您不需要配置文件,因此很可能使用编程配置.我建议您研究扫描所有系统属性,并根据此显式编程您想要的内容.


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.

  • 现在应该是更新包的接受答案.感谢您提供最新答案 - 我非常感谢您在长期存在的问题时获得最新答案.你为我节省了很多挫折感. (2认同)

lij*_*jat 6

根据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)


Rob*_*son 5

在我非常标准的设置中,当作为 VM 选项(Java 中的类之前的命令行,或 IDE 中的 VM 选项)传入时,我一直看到以下效果很好:

-Droot.log.level=TRACE
Run Code Online (Sandbox Code Playgroud)