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

Eng*_*_DJ 48 java spring spring-boot

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

我不想使用,application.properties因为我在Cloud Foundry上运行并希望在没有部署的情况下获取更改(但在应用程序重新启动后,或者重新开始更精确).

我已经尝试设置env vars,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE但这没有效果.把logging.level.org.springframework: TRACEapplication.properties做的工作,虽然.

Tim*_*ler 60

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

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

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

  • 我建议使用 JAVA_TOOL_OPTIONS 而不是 _JAVA_OPTIONS,如下所述:https://bugs.openjdk.java.net/browse/JDK-4971166 (3认同)
  • 可以在实践中确认:我检查了[sample-logback](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-logback)项目(使用版本1.3.0.RELEASE)并运行`mvn spring-boot:run -Dlogging.level.org.springframework = TRACE`,它产生了大量的日志输出.使用全部大写`-DLOGGING_LEVEL_ORG_SPRINGFRAMEWORK = TRACE`或其变体没有做任何事情. (2认同)
  • 如果`-D ...`参数起作用,那么设置`_JAVA_OPTIONS`环境变量实际上应该起作用!`mvn`命令会像任何`java`一样拾取它们。请注意,开头必须有下划线,这是必要的。有关更多信息,请参见http://stackoverflow.com/questions/17781405/。 (2认同)

Pet*_*ann 28

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

我遇到了与 OP 相同的问题。我想知道为什么这里的一些用户报告提出的解决方案运行良好,而其他用户则表示没有。
我在Spring Boot 2.1 上,问题显然在过去几年有所改变,但目前的情况如下:

TL; 博士

设置的日志级别有效

LOGGING_LEVEL_COM_ACME_PACKAGE=DEBUG
Run Code Online (Sandbox Code Playgroud)

为特定设置日志级别无效

LOGGING_LEVEL_COM_ACME_PACKAGE_CLASS=DEBUG
Run Code Online (Sandbox Code Playgroud)

怎么可能?

看看 Spring Boot 的LoggingApplicationListener
如果您调试它并在突出显示的代码块中设置断点,您会看到类的日志级别定义com.acme.mypackage.MyClass变为 com.acme.mypackage.myclass.
所以一个类的日志级别定义看起来就像一个包的日志级别定义。

这与 Spring 的Relaxed Binding 相关,它提出了环境变量的大写表示法。因此,类的典型驼峰式符号对于 LoggingApplicationListener 是不可见的:环境变量 forMyClass必须定义为MYCLASS并且将myclass在 Spring 的环境中可用(此示例忽略类的完全限定名称)

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

  • 现在文档中也承认了这一点:https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/boot-features-logging.html#boot-features-custom-log -levels 说“上述方法仅适用于包级别日志记录。由于宽松绑定始终将环境变量转换为小写,因此不可能以这种方式为单个类配置日志记录。如果需要为类配置日志记录,则可以使用 SPRING_APPLICATION_JSON 变量。” (4认同)

pep*_*uch 17

我还试图通过环境变量设置日志记录级别,但正如已经提到的那样,使用大写名称的环境变量是不可能的,例如.LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG.我也不想通过application.properties或做_JAVA_OPTIONS.

在深入研究课程后,org.springframework.boot.logging.LoggingApplicationListener我检查了春季启动试图将日志级别设置DEBUGORG_SPRINGFRAMEWORK包,这不是真正的包名.因此,结论是您可以使用环境变量来设置日志记录级别,但它必须采用以下形式: LOGGING_LEVEL_org.springframework=DEBUG logging.level.org.springframework=DEBUG

在春季靴子1.5.3上测试


小智 7

是的,您可以使用环境变量控制日志记录级别.以下是我在Cloud Foundry平台上部署的Spring Boot应用程序的实现方法.

在您的日志配置文件中,为日志记录级别提供占位符以从环境变量中读取值.默认为INFO.

    <logger name="com.mycompany.apps.cf" level="${APP_LOGGING_LEVEL:-INFO}">
      <appender-ref ref="CONSOLE"/>
    </logger>
Run Code Online (Sandbox Code Playgroud)

然后,在CF部署清单文件中提供环境变量.

    applications:
    - name: my-app-name
      memory: 2048
      env:
        APP_LOGGING_LEVEL: DEBUG

我希望这将有所帮助.


t0r*_*r0X 7

从 Spring Boot 2.0.x 开始,这再次起作用。使用 Spring Boot v2.0.9.RELEASE 进行测试。例如启用连接池调试日志:

LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
Run Code Online (Sandbox Code Playgroud)

或 Spring 框架调试日志:

LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG java -jar myApp.jar
Run Code Online (Sandbox Code Playgroud)

或两者:

LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
Run Code Online (Sandbox Code Playgroud)

有关更多应用程序属性,请参阅Spring Boot 参考文档中的“应用程序属性” 。

  • 更新的链接:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties (2认同)

Mic*_*iak 5

无论如何,我建议你使用 Spring 配置文件:

  1. 创建2个属性文件:

    application-local.propertiesapplication-remote.properties

    (配置文件名称显然可以不同)

  2. 相应地设置每个文件中的日志记录级别 ( logging.level.org.springframework)

  3. -Dspring.profiles.active=local在本地和-Dspring.profiles.active=remoteCF 上运行您的应用程序。


小智 5

另外,在 Cloud Foundry 中使用 Spring Boot (v1.2.3),我发现可以使用环境变量调整根日志记录级别,如下所示:

$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎无法降低特定包的日志记录级别(至少对于我正在使用的 Java Buildpack 和 Spring Boot 版本)。例如,除了上述内容之外添加以下内容不会降低 Spring 框架的日志级别:

$ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用 Splunk 之类的工具来收集日志,则也许可以过滤掉噪音。

另一种看起来很有希望的替代方案可能是基于构建包参数选项的自定义(请参见此处):

$ cf set-env <app name> '{arguments: "-logging.level.root=DEBUG -logging.level.org.springframework=INFO"}'
Run Code Online (Sandbox Code Playgroud)

可悲的是,我无法让它真正发挥作用。我当然同意,能够在包级别重新配置日志记录级别而不更改应用程序代码将很容易开始工作。