Java 如何在运行时使用log4j2api将loglevel从INFO设置为ERROR?
logger.setLevel()方法在log4j2 API中不可用。那么如何在运行时设置日志级别。我不确定这是否是最好的方法,但是您可以在org.apache.logging.log4j.core.config.LoggerConfig上设置级别,您可以通过LogManager从LoggerContext获得该级别 设置后,您可以使用新配置更新记录器 例如: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
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);