【发布时间】:2014-10-19 19:54:51
【问题描述】:
我在我的代码中这样声明记录器:
Logger logger = LoggerFactory.getLogger(MyClass.class);
我希望能够在运行时以编程方式更改我的记录器的日志级别。我尝试通过 LogManager 迭代存储库中的记录器,但它仅将新的日志级别应用于在代码中实例化的记录器。如果创建了新的记录器实例,它不会使用新的日志级别。我的要求是我的 Web 应用程序中的日志级别需要通过管理 GUI 进行配置,并且这个新的日志级别需要应用于我的代码中的所有记录器(不包括第三方库日志记录,例如 JSF、Spring、Hibernate 等) .
这就是我现在正在做的,它不符合我的要求,因为它不会将日志级别应用于新实例化的记录器:
Enumeration<Logger> currentLoggers = LogManager.getCurrentLoggers();
while(currentLoggers.hasMoreElements()) {
Logger logger = currentLoggers.nextElement();
if (StringUtils.startsWith(logger.getName(), "com.my.company")) {
logger.setLevel(logLevel);
}
}
我正在使用 Log4j 1.2.17。
【问题讨论】:
-
您需要以编程方式更改您的 log4j 配置。不仅是已经实例化的 Logger。见stackoverflow.com/a/4598829/982149
-
@Fildor,阅读该帖子后,我仍然不确定解决方案是什么。我不能做 LogManager.getRootLogger().setLevel(Level.DEBUG);因为它会更改根记录器,这将影响所有日志级别,包括来自 3rd 方库的日志级别。
-
我的 log4j 有点生锈,但我认为你可以为“com.my.company”设置日志级别,它会影响所有子 Logger。我会尽快回复你...
-
这似乎奏效了。我很早就尝试过,但觉得它不起作用。也许还有其他问题。现在它似乎工作了,谢谢!如果您将其发布为答案,我会接受。