当前位置: 首页 > 知识库问答 >
问题:

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

洪雨石
2023-03-14

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

共有3个答案

袁青青
2023-03-14

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

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您将更改根目录com级别。这就是为什么您必须添加一个新的LoggerConfig,以防要更改的模块尚未注册。

裴甫
2023-03-14

感谢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,这似乎对我来说是正确的。

颜华池
2023-03-14

我不确定这是否是最好的方法,但你可以在org上设置级别。阿帕奇。登录中。log4j。果心配置。可以通过LogManager从LoggerContext获取的LoggerConfig。

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

例如:

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
 类似资料:
  • 问题内容: 我需要禁用IPv6。为此,Java文档指示设置jvm属性。 但是我不了解如何从代码本身做到这一点。 许多论坛都演示了如何从命令提示符下执行此操作,但是我需要在运行时执行此操作。 问题答案: 您可以使用 这等效于通过以下命令在命令行中传递它

  • 问题内容: 使用Zend_Db执行UPDATE和INSERT查询时,我经常需要设置等于NULL的值(不是”)。但是,Zend_Db :: insert()和Zend_Db :: update()的默认行为似乎是将空值转换为空字符串(’‘)并照此放入数据库。 有谁知道如果php中的值为空,则实际上强制将NULL值放入字段的方法吗? 问题答案: 尝试将受影响的字段设置为:

  • 我希望在使用运行测试时,控制台尽可能安静,除非出现问题。再说一次,当我在Eclipse中编写测试时(换句话说,当我在Eclipse中运行单个junit测试时),它们可以非常详细。 因此,当我使用surefire运行所有测试时,我需要一种方法来拥有不同的log4j/logback设置,而不是在Eclipse中一个接一个地运行它们。有没有办法做到这一点?

  • 问题内容: 有人可以帮我如何在运行时设置宽度吗?我希望在运行时调整文本字段的大小。它将要求用户提供长度,然后输入将更改文本字段的宽度。 我正在为此使用布局,因为我处于编辑模式。 问题答案: 您只需要使用。这将使您在运行时增加它的大小。之所以无法做到这一点,是因为布局。这是不鼓励使用的主要原因之一。这是一个尝试的小例子: 对于绝对定位你需要调用上,以实现结果,但你应该始终牢记,为什么这种做法是气馁,

  • 问题内容: 使用IKVM时,如何在运行时设置CLASSPATH变量? 我一直在尝试使用以下方法: 我正在调用的类需要在类路径中使用配置文件才能工作-而且我不断收到错误消息,似乎表明它没有获得设置。 我尝试添加变量的方式不正确吗? 问题答案: 我试图做同样的事情。我将一些jar文件编译为.Net dll,但是其中一些(第3方)jar文件正试图从java类路径中加载其配置文件。 我通过为ikvmc工具

  • 我写了一个应用程序,使用Spring MongoRepository连接到产品销售的集合,其中包含所有产品的销售数据。 现在,我面临一个问题,因为我现在有多个产品销售集合,而不是一个集合,每个集合包含一个产品。所有集合的结构仍然相同,但现在每个集合的名称类似于“Sales_123”、“Sales_456”,其中数字后缀是产品Id。 这意味着我不能再使用文档注释来指定集合名称。我仍然可以在运行时将集