如何在运行时使用log4j2 api将loglevel从INFO设置为ERROR?

时间:2013-06-19 08:16:58

标签: java log4j2

logger.setLevel()方法在log4j2 API中不可用。那么如何在运行时设置日志级别。

5 个答案:

答案 0 :(得分:12)

我不确定这是否是最好的方法,但是您可以在 org.apache.logging.log4j.core.config.LoggerConfig 上设置级别,您可以通过LoggerContext从LoggerContext获取该级别。日志管理。

设置完成后,您可以使用新配置更新记录器。

举个例子:

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

答案 1 :(得分:8)

归功于amcintosh,我将answer包装在一个函数中:

/** 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;
}

尽管有amoe的评论,但这似乎对我使用Log4J 2.5正常工作。

答案 2 :(得分:5)

就我而言,我必须使用此代码才能使此工作正常(基于之前的答案)。

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的级别,您将更改{{1 }或root级别。这就是为什么你必须添加一个新的com以防止要修改的模块尚未注册。

答案 3 :(得分:3)

答案 4 :(得分:2)

加里格雷戈里是对的。

此问题的答案就在log4j2网站的常见问题解答页面上

https://logging.apache.org/log4j/2.x/faq.html#reconfig_level_from_code

以下示例代码:

Configurator.setLevel(logger.getName(), Level.INFO);