跨所有实例动态更改日志级别

5

假设我有一个使用Log4j进行日志记录的Spring Boot应用程序。
在这里,我想动态更改日志级别,而不必启动整个应用程序。
可以通过公开一些端点来实现此目标。
但是,在生产级别上,可能会有多个相同应用程序的实例在不同的服务器上运行。
那么,我们如何在Kubernetes管理的运行应用程序的所有容器实例之间动态设置日志记录级别呢?

2个回答

1

不确定如何在 K8s 上使用配置映射解决问题。 环境变量、命令行参数和配置文件是应用程序启动后只读取/使用一次的。对它们的任何更改都不会在无重新启动的情况下反映到应用程序中。

我使用的解决方案之一是在记录器库(log4j或logback)上设置扫描间隔。 例如,在 logback 中,有一个自动扫描配置参数https://logback.qos.ch/manual/configuration.html#autoScan

这允许应用程序定期检查定义的间隔时间内 config 文件中定义日志级别的更改。 因此,即使您使用多个应用程序实例,所有实例都将扫描同一配置文件并在无需重新启动的情况下进行更新。


-1

如果您的应用程序从application.propertiesapplication.yaml读取日志级别,ConfigMap可以实现:

ConfigMap是用于以键值对存储非机密数据的API对象。Pod可以将ConfigMaps作为环境变量、命令行参数或卷中的配置文件来使用。 ConfigMap允许您将特定于环境的配置与容器映像分离,使您的应用程序易于移植。

您可以查看我的其他答案,我在其中逐步说明了如何使用ConfigMap


但是,它是否实时?比如说,我已经开始了所有日志级别为INFO的集群。过一段时间我想将其更改为DEBUG,那么你的方法能在不重新启动所有集群的情况下工作吗?我认为,由于你正在处理配置文件,它应该只需要一次。我理解得对吗? - lnx
ConfigMap可以实时更新,但是您需要使用外部工具来完成,例如Reloader。我在我的另一个答案中详细介绍了它。 - RadekW
@lnx 这对你有帮助吗?你还有更多问题吗? - RadekW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接