Как установить loglevel из INFO в ERROR, используя log4j2 api во время выполнения?
Метод logger.setLevel() недоступен в log4j2 API. Итак, как установить уровень журнала во время выполнения.
Ответы
Ответ 1
Я не уверен, что это лучший способ, но вы устанавливаете уровень на org.apache.logging.log4j.core.config.LoggerConfig, который вы можете получить из LoggerContext через LogManager.
После установки вы можете обновить регистраторы с новой конфигурацией.
В качестве примера:
public static void main(String[] args) {
Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
log.error("An error");
log.debug("A debug");
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
ctx.updateLoggers(conf);
log.error("Another error");
log.debug("Another debug");
}
Урожайность:
14:03:41.346 [main] ERROR - An error
14:03:41.348 [main] ERROR - Another error
14:03:41.348 [main] DEBUG - Another debug
Ответ 2
Кредит amcintosh, я завернул их ответ в функции:
/** Override the logging level of a given logger, return the previous level */
public static Level setLevel(Logger log, Level level) {
LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
LoggerConfig lconf = conf.getLoggerConfig(log.getName());
Level oldLevel = lconf.getLevel();
lconf.setLevel(level);
ctx.updateLoggers(conf);
return oldLevel;
}
Несмотря на комментарий амея, это, похоже, работает правильно для меня, используя Log4J 2.5.
Ответ 3
На моей стороне мне пришлось использовать этот код, чтобы он работал нормально (на основе предыдущих ответов).
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
...
public static void changeLoggerLevel(final String module, final Level level) {
String moduleRenamed = module.replaceAll("/", ".");
LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
AbstractConfiguration configuration = (AbstractConfiguration) ctx
.getConfiguration();
if (configuration.getLogger(moduleRenamed) != null) {
LoggerConfig loggerConfig = configuration.getLoggerConfig(moduleRenamed);
loggerConfig.setLevel(level);
} else {
LoggerConfig loggerConfig = new LoggerConfig(moduleRenamed, level, true);
configuration.addLogger(moduleRenamed, loggerConfig);
}
ctx.updateLoggers(configuration);
}
Проблема заключалась в вызове getLoggerConfig()
; если модуль, который вы пытаетесь дать новый уровень, еще не зарегистрирован, этот метод возвращает корневой регистратор (или любой зарегистрированный промежуточный путь), и вместо этого вместо изменения уровня для com.mycompany
вы будете изменять root
или com
. Поэтому вам нужно добавить новый LoggerConfig
, если модуль для изменения еще не зарегистрирован.
Ответ 4
Следующие API в классе org.apache.logging.log4j.core.config.Configurator позволяют изменять уровни:
Ответ 5
Гэри Грегори прав.
Также ответ на этот вопрос находится прямо на странице часто задаваемых вопросов на сайте log4j2
https://logging.apache.org/log4j/2.x/faq.html#reconfig_level_from_code
Пример кода ниже:
Configurator.setLevel(logger.getName(), Level.INFO);