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