Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时使用log4j2api将loglevel从INFO设置为ERROR?_Java_Log4j2 - Fatal编程技术网

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

Java 如何在运行时使用log4j2api将loglevel从INFO设置为ERROR?,java,log4j2,Java,Log4j2,logger.setLevel()方法在log4j2 API中不可用。那么如何在运行时设置日志级别。我不确定这是否是最好的方法,但是您可以在org.apache.logging.log4j.core.config.LoggerConfig上设置级别,您可以通过LogManager从LoggerContext获得该级别 设置后,您可以使用新配置更新记录器 例如: public static void main(String[] args) { Logger log = LogManager

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

我不确定这是否是最好的方法,但是您可以在org.apache.logging.log4j.core.config.LoggerConfig上设置级别,您可以通过LogManager从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

归功于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;
}

尽管有amoe的评论,但使用Log4J 2.5这似乎对我来说是正确的。

在我这方面,我必须使用这段代码才能使其正常工作(基于之前的答案)


问题在于电话;如果您试图赋予新级别的模块尚未注册,此方法将返回根记录器(或任何已注册的中间子路径),因此,您将更改
root
com
级别,而不是更改
com的级别。这就是为什么您必须添加一个新的
LoggerConfig
,以防要更改的模块尚未注册

类中的以下API允许您更改级别:


加里·格雷戈里是正确的

这个问题的答案也在log4j2网站的FAQ页面上

示例代码如下:

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

适用于根记录器,但不适用于任何其他记录器——例如,每个包。在这种情况下,即使在上下文上调用
reconfigure
时,日志级别似乎也没有改变。@这里也有同样的问题。我想这与webapp程序的正确上下文有关。您是否希望经理更改所有记录器级别?很好,行为已记录在案,但不是人们通常期望的。但是,如果我理解您的意思,那么在调用
getLoggerConfig()
之前,只需确保
记录器
存在,就可以等效地解决这个问题,对吗?我没有尝试过,但我会说记录器继承自上一个(更高)级别(可能是根),因此总是定义的。。。这似乎只是没有完全提供的配置继承(为了更改日志级别而必须更改的是配置,而不是记录器本身)。当您只需执行上面解释的“'Configurator.setLevel(logger.getName(),level.INFO);”时,为什么要执行所有这些操作?是否可以为特定于线程的配置它?行为与ThreadContext相同。@TheGamberrises我建议发布一个单独的问题,而不是试图在评论中探讨这个问题。顺便说一句,我想您不能用这种机制控制每个线程的日志级别,但很可能有其他方法来实现您想要的。如果你发布了一个单独的问题,请随意在此处共享一个链接。虽然这可能会在理论上回答问题,但可能会重复,请在此处包含答案的基本部分,并提供链接供参考。
Configurator.setLevel(logger.getName(), Level.INFO);