logger.setLevel()方法在 log4j2 API 中不可用。那么如何在运行时设置日志级别。
5 回答
我不确定这是否是最好的方法,但是您可以在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 正常工作。
就我而言,我必须使用此代码才能使其正常工作(基于以前的答案)。
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
的,以防要更改的模块尚未注册。
加里·格雷戈里是正确的。
这个问题的答案也在 log4j2 网站的 FAQ 页面上
https://logging.apache.org/log4j/2.x/faq.html#reconfig_level_from_code
下面的示例代码:
Configurator.setLevel(logger.getName(), Level.INFO);
org.apache.logging.log4j.core.config.Configurator类中的以下 API允许您更改级别: