Как установить уровень log4j в командной строке?



Я хочу добавить некоторые журнала.отладочные операторы для класса, над которым я работаю, и я хотел бы видеть это в выводе при запуске теста. Я хотел бы переопределить свойства log4j в командной строке, с чем-то вроде этого:



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


Я часто делаю такие вещи. Меня конкретно интересует только способ передать это в командной строке. Я знаю, как это сделать с конфигурационным файлом, и это не соответствует моему рабочему процессу.

531   7  

7 ответов:

настройки 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}

затем в командной строке включите системное свойство -Dlog4j.info -Dmy.logging.threshold=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 метод в вашем основном() или где бы то ни было подходящем и передайте параметры командной строки -Dlog4j.logger=com.mypackage.Thingie и -Dlog4j.debug=true.

на основе предложения Thorbjørn Ravn Andersens я написал некоторый код, который делает эту работу

добавьте следующее В начале основного метода, и теперь можно установить уровень журнала из строки 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, вот упрощенная реализация. В моем весеннем приложении я просто загружаю это как Боб.

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

в моей довольно стандартной настройке я видел, что следующая работа хорошо работает при передаче в качестве опции VM (командная строка перед классом в Java или опция VM в IDE):

-Droot.log.level=TRACE

Comments

    Ничего не найдено.