Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

log4j не поддерживает это напрямую.

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

Ответ 2

Как часть ваших аргументов jvm вы можете установить -Dlog4j.configuration=file:"<FILE_PATH>". Где FILE_PATH - это путь к вашему файлу log4j.properties.

Обратите внимание, что с log4j2 новая системная переменная, используемая в качестве log4j.configurationFile, и вы вставляете фактический путь к файлу ( т.е. без префикса file:), и он автоматически загрузит factory на основе расширения файла конфигурации:

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

Ответ 3

Эти ответы на самом деле отговорили меня от попыток простейшей возможной вещи! Просто укажите порог для appender (скажем, "console" ) в вашем log4j.configuration, например:

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

Затем в командной строке укажите системное свойство -Dlog4j.info -Dmy.logging.threshold=INFO. Я предполагаю, что любое другое свойство может быть параметризовано таким образом, но это самый простой способ повысить или понизить уровень ведения журнала в глобальном масштабе.

Ответ 4

С 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 в своих основных() или любых соответствующих параметрах командной строки pass -Dlog4j.logger=com.mypackage.Thingie и -Dlog4j.debug=true.

Ответ 5

Основываясь на предложении 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);
        }
    }

Ответ 6

Основываясь на @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);
    }
  }
}

Ответ 7

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

-Droot.log.level=TRACE