有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在Spring引导应用程序中,是否可以仅通过环境变量设置日志记录级别

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

我尝试过将env变量设置为LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE,但没有效果。不过,将logging.level.org.springframework: TRACE放在application.properties中确实有效


共 (6) 个答案

  1. # 1 楼答案

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

    $ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG
    

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

    $ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO
    

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

    另一个看起来很有希望的选择是基于构建包的参数选项的定制(请参见here):

    $ cf set-env <app name> '{arguments: "-logging.level.root=DEBUG -logging.level.org.springframework=INFO"}'
    

    遗憾的是,我无法让它真正起作用。我当然同意,能够在不更改应用程序代码的情况下在包级别重新配置日志记录级别将非常方便

  2. # 2 楼答案

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

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

    TL;博士

    设置包的日志级别有效

    LOGGING_LEVEL_COM_ACME_PACKAGE=DEBUG
    

    虽然为特定的类设置日志级别没有效果

    LOGGING_LEVEL_COM_ACME_PACKAGE_CLASS=DEBUG
    

    怎么会这样

    看看Spring Boot的LoggingApplicationListener
    如果调试它并在突出显示的代码块中设置断点,就会看到类com.acme.mypackage.MyClass的日志级别定义变为 com.acme.mypackage.myclass
    因此,类的日志级别定义看起来与包的日志级别定义完全相同

    这与Spring的Relaxed Binding有关,后者提出了环境变量的大写表示法。因此,对于LoggingApplicationListener,类的典型驼峰式表示法是不可见的:MyClass的环境变量必须定义为MYCLASS,并且在Spring的环境中可以作为myclass使用(这个示例忽略了类的完全限定名)

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

  3. # 3 楼答案

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

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

        <logger name="com.mycompany.apps.cf" level="${APP_LOGGING_LEVEL:-INFO}">
          <appender-ref ref="CONSOLE"/>
        </logger>
    

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

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

    我希望这会有所帮助

  4. # 4 楼答案

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

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

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

  5. # 5 楼答案

    从Spring Boot 2.0开始。这又起作用了。用Spring Boot v2测试。0.9.释放例如,启用连接池调试日志:

    LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
    

    或Spring框架调试日志:

    LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG java -jar myApp.jar
    

    或者两者兼而有之:

    LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
    

    有关更多应用程序属性,请参见"Application Poperties" in Spring Boot Reference Documentation

  6. # 6 楼答案

    我还试图通过环境变量设置日志记录级别,但如前所述,使用大写名称的环境变量是不可能的,例如LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG。我也不想通过application.properties_JAVA_OPTIONS来做这件事

    在深入研究类org.springframework.boot.logging.LoggingApplicationListener之后,我检查了spring boot是否试图将日志记录级别DEBUG设置为ORG_SPRINGFRAMEWORK包,而这不是真正的包名。所以结论是,您可以使用环境变量来设置日志记录级别,但它需要采用以下形式: LOGGING_LEVEL_org.springframework=DEBUG logging.level.org.springframework=DEBUG

    在弹簧靴1.5.3上测试