通过环境变量

时间:2015-12-09 14:19:45

标签: java spring spring-boot

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

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

我尝试设置像LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE这样的env vars,但这没有效果。将logging.level.org.springframework: TRACE放入application.properties确实有效。

10 个答案:

答案 0 :(得分:52)

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

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

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

答案 1 :(得分:12)

我还尝试通过环境变量设置日志记录级别,但正如已经提到的那样,使用大写名称的环境变量是不可能的,例如。 LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG。我也不想通过application.properties_JAVA_OPTIONS进行此操作。

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

在春季靴子1.5.3上测试

答案 2 :(得分:5)

是的,您可以使用环境变量控制日志记录级别。以下是我在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

我希望这会有所帮助。

答案 3 :(得分:3)

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

  1. 创建2个属性文件:

    application-local.propertiesapplication-remote.properties

    (个人资料名称可能明显不同)

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

  3. 在本地运行您的应用程序-Dspring.profiles.active=local,为CF运行-Dspring.profiles.active=remote

答案 4 :(得分:2)

有人可以解释为什么这不起作用?

$ export LOGGING_LEVEL_COM_ACME = ERROR

对于使用环境变量作为覆盖的所有其他配置似乎没有问题,例如:

$ export EUREKA_CLIENT_ENABLED = false

感谢。

答案 5 :(得分:2)

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

$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG

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

$ 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"}'
可悲的是,我无法让它真正发挥作用。我当然同意能够在不改变应用程序代码的情况下在包级别重新配置日志记录级别将非常方便。

答案 6 :(得分:1)

在spring-boot 2.0.0中,添加--trace是可行的。 例如java -jar myapp.jar --debugjava -jar myapp.jar --trace

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html#boot-features-logging-console-output

答案 7 :(得分:1)

只能通过Packages而不是Classes来通过环境变量设置日志级别

我和OP有同样的问题。我想知道为什么这里的一些用户报告说所提出的解决方案行之有效,而其他人则回答说却没有。
我使用的是 Spring Boot 2.1 ,在过去的几年中,问题显然有所改变,但是当前情况如下:

TL; DR

设置软件包的日志级别有效

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。另一方面,我认为无法检查给定的完全限定路径是否与类匹配。只要表示法不完全匹配,类加载器就什么也找不到。

因此,环境变量中的日志定义不适用于类,而仅适用于包。

答案 8 :(得分:0)

以下是使用LogbackJanino通过properties or environmental variables有条件地包含不同日志记录配置的示例...基本配置,logback.xml使用条件进行开发控制台日志记录或生产文件记录...只需删除12-17 18:12:36.346: I/Timeline(2526): Timeline: Activity_launch_request id:com.shezartech.iitjeeacademy.ui.activity time:15338553 12-17 18:12:36.406: W/System.err(2526): java.lang.NoSuchMethodException: sequence [] 12-17 18:12:36.406: W/System.err(2526): at java.lang.Class.getMethod(Class.java:665) 12-17 18:12:36.406: W/System.err(2526): at com.b.a.e.a(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at com.b.a.l.<clinit>(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at com.shezartech.iitjeeacademy.ui.activity.RegisterActivity.onCreate(Unknown Source) 12-17 18:12:36.406: W/System.err(2526): at android.app.Activity.performCreate(Activity.java:6283) 12-17 18:12:36.406: W/System.err(2526): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 12-17 18:12:36.406: W/System.err(2526): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 12-17 18:12:36.406: W/System.err(2526): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 12-17 18:12:36.406: W/System.err(2526): at android.app.ActivityThread.access$900(ActivityThread.java:177) 12-17 18:12:36.406: W/System.err(2526): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 12-17 18:12:36.406: W/System.err(2526): at android.os.Handler.dispatchMessage(Handler.java:102) 12-17 18:12:36.406: W/System.err(2526): at android.os.Looper.loop(Looper.java:145) 12-17 18:12:36.406: W/System.err(2526): at android.app.ActivityThread.main(ActivityThread.java:5942) 12-17 18:12:36.406: W/System.err(2526): at java.lang.reflect.Method.invoke(Native Method) 12-17 18:12:36.406: W/System.err(2526): at java.lang.reflect.Method.invoke(Method.java:372) 12-17 18:12:36.406: W/System.err(2526): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 12-17 18:12:36.406: W/System.err(2526): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 12-17 18:12:36.406: D/AndroidRuntime(2526): Shutting down VM 12-17 18:12:36.406: E/AndroidRuntime(2526): FATAL EXCEPTION: main 12-17 18:12:36.406: E/AndroidRuntime(2526): Process: com.shezartech.iitjeeacademy.ui.activity, PID: 2526 12-17 18:12:36.406: E/AndroidRuntime(2526): java.lang.ExceptionInInitializerError 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.shezartech.iitjeeacademy.ui.activity.RegisterActivity.onCreate(Unknown Source) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.Activity.performCreate(Activity.java:6283) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.ActivityThread.access$900(ActivityThread.java:177) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.os.Handler.dispatchMessage(Handler.java:102) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.os.Looper.loop(Looper.java:145) 12-17 18:12:36.406: E/AndroidRuntime(2526): at android.app.ActivityThread.main(ActivityThread.java:5942) 12-17 18:12:36.406: E/AndroidRuntime(2526): at java.lang.reflect.Method.invoke(Native Method) 12-17 18:12:36.406: E/AndroidRuntime(2526): at java.lang.reflect.Method.invoke(Method.java:372) 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 12-17 18:12:36.406: E/AndroidRuntime(2526): Caused by: com.b.a.c.b: 'com.b.a.b.a' requires the 'sequence' attribute. 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.b.a.f.a(Unknown Source) 12-17 18:12:36.406: E/AndroidRuntime(2526): at com.b.a.l.<clinit>(Unknown Source) 12-17 18:12:36.406: E/AndroidRuntime(2526): ... 14 more

中的以下文件即可
  

logback.xml

/resources/
  

dev.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <if condition='property("spring.profiles.active").contains("dev")'>
        <then>
            <include resource="org/springframework/boot/logging/logback/base.xml"/>
            <include resource="dev.xml" optional="true"/>
        </then>
    </if>
    <if condition='property("spring.profiles.active").contains("pro")'>
        <then>
            <include resource="org/springframework/boot/logging/logback/base.xml"/>
            <include resource="pro.xml" optional="true"/>
        </then>
    </if>
</configuration>
  

pro.xml

<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>utf-8</charset>
            <Pattern>%-30([%p] [%c:%L]) » %m%n%rEx</Pattern>
        </encoder>
    </appender>

    <!-- CHATTY LOGGERS HERE.-->
    <logger name="org.springframework" level="DEBUG"/>

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <root level="${logback.loglevel}">
        <appender-ref ref="CONSOLE"/>
    </root>

</included>

答案 9 :(得分:0)

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

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

有关更多应用程序属性,请参见Spring Boot documentation "Appendix A. Common application properties"