java - log4j教學 - log4j level



如何在命令行上設置log4j級別? (5)

我想在我正在處理的類中添加一些log.debug語句,並且我希望在運行測試時在輸出中看到它。 我想在命令行上覆蓋log4j屬性,如下所示:

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

我經常這樣做。 我特別感興趣的是在命令行上傳遞它的方法。 我知道如何使用配置文件來完成它,這不適合我的工作流程。

https://ffff65535.com


log4j不直接支持這一點。

由於您不需要配置文件,因此很可能使用編程配置。 我建議您研究掃描所有系統屬性,並根據此顯式編程您想要的內容。


作為jvm參數的一部分,您可以設置-Dlog4j.configuration=file:"<FILE_PATH>" 。 其中FILE_PATH是log4j.properties文件的路徑。

請注意,從log4j2 ,要使用的新系統變量是log4j.configurationFile ,你輸入文件的實際路徑(即沒有file: prefix),它會根據配置文件的擴展名自動加載工廠:

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

在我非常標準的設置中,當我作為VM Option(Java中的類之前的命令行或IDE中的VM Option)傳入時,我已經看到以下工作:

-Droot.log.level=TRACE

基於@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);
    }
  }
}

這些答案實際上阻止了我嘗試最簡單的事情! 只需在log4j.configuration指定appender(例如“console”)的閾值,如下所示:

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

然後,在命令行上,包括系統屬性-Dlog4j.info -Dmy.logging.threshold=INFO 。 我假設任何其他屬性都可以通過這種方式進行參數化,但這是提高或降低全局日誌記錄級別的最簡單方法。





log4j