通过环境变量在 Spring Boot 中设置日志记录级别

2022-08-31 13:16:02

是否可以在 Spring Boot 应用程序中单独通过环境变量设置日志记录级别?

我不想使用,因为我在Cloud Foundry上运行,并且想要在没有部署的情况下获取更改(但是在应用程序重新启动或更准确地说是重新调整之后)。application.properties

我尝试过像设置env vars一样,但这没有任何效果。不过,投入确实有效。LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACElogging.level.org.springframework: TRACEapplication.properties


答案 1

这只是一个想法,但你有没有尝试过设置

_JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACE?

从理论上讲,这种方式将作为默认的 JVM 参数传递,并且应该会影响环境中的每个 JVM 实例。-Dlogging.level.org.springframework=TRACE


答案 2

通过环境变量设置日志级别只能对包进行,而不能对类执行

我遇到了与OP相同的问题。我想知道为什么这里的一些用户报告说,建议的解决方案效果很好,而另一些用户则没有。
我正在使用Spring Boot 2.1,在过去的几年中,问题显然发生了一些变化,但目前的情况如下:

TL;DR

设置包的日志级别有效

LOGGING_LEVEL_COM_ACME_PACKAGE=DEBUG

虽然为特定类设置日志级别不起作用

LOGGING_LEVEL_COM_ACME_PACKAGE_CLASS=DEBUG

这怎么可能?

看看Spring Boot的LogingApplicationListener
如果要对其进行调试并在突出显示的代码块中设置断点,则会看到类的日志级别定义变为 。
因此,类的日志级别定义看起来与包的日志级别定义完全相同。com.acme.mypackage.MyClasscom.acme.mypackage.myclass

这与Spring的宽松绑定有关,它提出了环境变量的大写表示法。因此,对于 LoggingApplicationListener,类的典型驼峰大小写表示法是不可见的:的环境变量必须定义为并且将像在 Spring 的环境中一样可用(此示例忽略类的完全限定名称)。MyClassMYCLASSmyclass

一旦类的驼峰大小写符号丢失,在运行时,就没有机会恢复原始类名。因此,环境变量中的日志定义不适用于类,而仅适用于包。


推荐