2015-12-09 16 views
24

スプリングブートアプリケーションで環境変数だけでロギングレベルを設定することは可能でしょうか?環境変数によるスプリングブート時のロギングレベルの設定

私はCloud Foundryで稼働しているため、デプロイメントなしで変更を取りたい(ただし、アプリが再起動した後、またはより正確に再起動した後に)application.propertiesを使用したくありません。

envvarsをLOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACEのように設定しようとしましたが効果がありません。しかし、logging.level.org.springframework: TRACEapplication.propertiesに入れても動作します。

答えて

25

これは単なるアイデアですが、あなたは

_JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACEを設定してみてくださいましたか?

理論的には、このように-Dlogging.level.org.springframework=TRACEがデフォルトのJVM引数として渡され、環境内のすべてのJVMインスタンスに影響するはずです。

+2

実際に確認することができます:[sample-logback](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample)をチェックアウトしました。 -logbackバージョン1.3.0.RELEASEを使用して)プロジェクト()と 'MVN春ブートを実行しました:ログ出力の多くを生産-Dlogging.level.org.springframework = TRACE'を実行します。 '-DLOGGING_LEVEL_ORG_SPRINGFRAMEWORK = TRACE'のすべての大文字またはその変形を使用しても何も起こりませんでした。 – vanOekel

+1

場合に '-D ...'パラメータ作品は、その後、設定 '_JAVA_OPTIONS'環境変数は、実際に動作するはずです! 'mvn'コマンドは' java'と同じようにそれらを選択します。しかし、最初はアンダースコアに注意してください。それは必要です。詳細については、http://stackoverflow.com/questions/17781405/をご覧ください。 – Timekiller

+0

私は試してみることをあげる - これはクラウドファウンドリーのJava Buildpack経由で実行されますが、うまくいけば、それは_JAVA_OPTIONS' –

2

私はとにかくあなたが春のプロファイルを使用することをお勧め:

  1. が2つのプロパティファイルを作成します。

    application-local.propertiesapplication-remote.properties

    を(プロファイル名は明らかに異なる場合があります)

  2. これに応じて、各ファイルのログレベルを設定します(logging.level.org.springframework

  3. ローカルで-Dspring.profiles.active=local-Dspring.profiles.active=remoteでアプリケーションを実行します。

+0

ありがとう:別の環境変数、 'JAVA_OPTS'を使用する方法について説明します。残念ながら、これは実行時間ではなく、設計時の冗長性を増やしたいものを知る必要があります。あなたがローカルでアプリケーションを実行している場合は –

4

はい、環境変数を使用してログレベルを制御できます。ここでは、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 

これが役立ちます。

+0

、-DAPP_LOGGING_LEVEL = DEBUG – Sparkle8

+0

を使用する私は、回避策として似た何かをやったが、それはあなたがかなり制限され、設計時、で制御できるようにしたいロガーを知るために有することを意味します。 –

0

はここで、条件付きproperties or environmental variables ...基本設定を経由して別のログのconfigsを含めるようにLogbackJaninoを使用した例ですが、ちょうど/resources/に以下のファイルをドロップ...開発コンソールロギングや本番ファイル・ロギングのための条件文を使用しているlogback.xml


logback。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> 

dev.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> 

pro.xml

<included> 
    <conversionRule conversionWord="wex" 
        converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> 
    <property name="FILE_LOG_PATTERN" 
       value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/> 
    <property name="FILE_NAME_PATTERN" value="./logs/%d{yyyy-MM-dd}-exec.log"/> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>FILE_NAME_PATTERN</fileNamePattern> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
     <encoder> 
      <pattern>${FILE_LOG_PATTERN}</pattern> 
     </encoder> 
    </appender> 

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> 
     <queueSize>512</queueSize> 
     <appender-ref ref="FILE"/> 
    </appender> 

    <!-- APP SPECIFIC LOGGERS HERE.--> 
    <logger name="org.springframework.boot.SpringApplication" level="INFO"/> 

    <root level="INFO"> 
     <appender-ref ref="FILE"/> 
    </root> 

</included> 
2

誰もがこれがなぜ機能しないのか説明できますか?オーバーライドは、例えば、問題なく動作するようですと、環境変数を使用して他のすべての構成については

$輸出LOGGING_LEVEL_COM_ACME = ERROR

$輸出EUREKA_CLIENT_ENABLED = falseを

感謝。

+4

Springブートはロギングレベルを決定するために環境変数を使用しないためです。これは、(-Dlogging.level.blah = FOOで指定)JVMシステムプロパティを使用することができますが、それは、ロギングの設定を処理した後まで、潜在的なプロパティ値などの環境変数にマージしていないようです。 –

1

はまた、クラウドファウンドリー春ブーツ(v1.2.3)を使用して、私は次のように環境変数を使用して、ルートのログレベルを調整することが可能であることを発見しました:

$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG 

は残念ながら、それはしていません特定のパッケージのロギングレベルをダイヤルダウンすることができるようです(Java BuildpackとSpring Bootのバージョンでは少なくとも使用しています)。しかし、

$ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO 

あなたのログを収集するためにSplunkのようなものを使用している場合は、ノイズを除去することができる場合がありますたとえば、Springフレームワークのログレベルを低下させない上記に加えて、以下の追加。有望に見える

別の方法としては、ビルドパックの引数オプションのカスタマイズに基づくことができる(hereを参照してください):

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

悲しいことに、私はこれが実際に動作させることができませんでした。私は確かに、アプリケーションコードを変更せずにパッケージレベルでロギングレベルを再構成することができれば、うまくいくことに同意します。

3

また、環境変数を使ってロギングレベルを設定しようとしましたが、すでに述べたように、大文字の環境変数を使用することはできません。 LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG。私もapplication.propertiesまたは_JAVA_OPTIONSでそれをしたくなかった。

クラスorg.springframework.boot.logging.LoggingApplicationListenerを掘り下げた後、実際のパッケージ名ではないログレベルDEBUGORG_SPRINGFRAMEWORKに設定しようとしました。だから、結論は、ロギングレベルを設定するには、環境変数を使用することができるということですが、それは形にする必要があります: LOGGING_LEVEL_org.springframework=DEBUG または 春ブーツ1.5でテスト logging.level.org.springframework=DEBUG

。3

関連する問題