Как установить уровень log4j в командной строке?
Я хочу добавить некоторые инструкции log.debug к классу, над которым я работаю, и я хотел бы видеть это на выходе при запуске теста. Я хотел бы переопределить свойства log4j в командной строке, например:
-Dlog4j.logger.com.mypackage.Thingie=DEBUG
Я часто это делаю. Меня особенно интересует способ передать это в командной строке. Я знаю, как это сделать с конфигурационным файлом, и это не подходит для моего рабочего процесса.
Ответы
Ответ 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