web-dev-qa-db-ja.com

spring boot、logbackおよびlogging.configプロパティ

私は、logbackライブラリを使用して、スプリングブートプロジェクトにロギングを実装しています。スプリングプロファイル(プロパティ 'spring.pofiles.active')に応じてさまざまなログ構成ファイルをロードしたい。 logback-dev.xml、logback-inte.xml、logback-prod.xmlの3つのファイルがあります。スプリングブートバージョン1.2.2.RELEASEを使用しています。

スプリングブートドキュメントで読むことができるように( here )。それは言います:

さまざまなロギングシステムは、クラスパスに適切なライブラリを含めることでアクティブにでき、クラスパスのルートまたはSpring Environmentプロパティで指定された場所に適切な構成ファイルを提供することでさらにカスタマイズできます。 logging.config。 (ただし、ApplicationContextが作成される前にロギングが初期化されるため、Spring @Configurationファイルの@PropertySourcesからロギングを制御することはできません。システムプロパティと従来のSpring Boot外部構成ファイルは正常に機能します。)

そこで、application.propertiesファイルに「logging.config」プロパティを設定しようとしました。

logging.config=classpath:/logback-${spring.profiles.active}.xml

しかし、アプリケーションを起動すると、logback- {profile} .xmlがロードされません...

ロギングは、スプリングブートを使用するすべてのプロジェクトで遭遇した共通の問題だと思います。私は上記のアプローチで正しい軌道に乗っていますか?他にも機能するソリューションはありますが、エレガントではありません(logback.xmlファイルまたはコマンドラインプロパティでのJaninoの条件付き解析)。

51
LG_

私は解決策を見つけ、application.propertiesファイルで定義された 'logging.config'プロパティをspringが使用しない理由を理解しました。

解決策と説明:

ロギングを初期化するとき、Spring Bootは classpathまたは環境変数 のみを検索します。

私が使用した解決策は、スプリングプロファイルに応じた適切なロギング構成ファイルを含む親logback.xmlファイルを含めることでした。

logback.xml:

<configuration>
    <include resource="logback-${spring.profiles.active}.xml"/>
</configuration>

logback- [profile] .xml(この場合、logback-dev.xml):

<included>

    <!-- put your appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
           <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern>
           <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- put your root here -->
    <root level="warn">
        <appender-ref ref="CONSOLE" />
    </root>

</included>

注: 'spring.profiles.active'は、アプリの起動時にコマンドライン引数で設定する必要があります。 JVMプロパティのE.G:-Dspring.profiles.active=dev

参考資料:

Edit(複数のアクティブなプロファイル):複数のファイルを回避するために、Janino依存性を必要とする条件付き処理を使用できます( setup here )、参照- 条件付きドキュメント 。この方法を使用すると、複数のアクティブなプロファイルを同時に確認することもできます。 E.G(このソリューションをテストしなかったので、うまくいかない場合はコメントしてください):

<configuration>

    <if condition='"${spring.profiles.active}".contains("profile1")'>
        <then>
         <!-- do whatever you want for profile1 -->
        </then>
    </if>

    <if condition='"${spring.profiles.active}".contains("profile2")'>
        <then>
         <!-- do whatever you want for profile2 -->
        </then>
    </if>

    <!-- common config -->

</configuration>

条件付き処理の別の例については、javaseniorの回答を参照してください。

63
LG_

複数のプロファイルを処理できる別のアプローチは、環境ごとに個別のプロパティファイルを作成することです。

application-prod.properties

logging.config=classpath:logback-prod.xml

application-dev.properties

logging.config=classpath:logback-dev.xml

application-local.properties

logging.config=classpath:logback-local.xml

注意してください

注意しないと、予期しない場所でログが記録される可能性があります

-Dspring.profiles.active=local,dev //will use logback-dev.xml
-Dspring.profiles.active=dev,local //will use logback-local.xml
27
Zergleb

各プロファイルに個別のlogback xmlを追加したり、IF条件を設定したりする代わりに、条件付き処理を簡単にするために以下をお勧めします(xmlの違いが少ない場合)。

<springProfile name="dev">
<logger name="org.sample" level="DEBUG" />
</springProfile>
<springProfile name="prod">
<logger name="org.sample" level="TRACE" />
</springProfile>
9
nav3916872

ログバックを使用した条件付き処理は、多くのログバックファイルを使用しないソリューションです。 リンク と、スプリングプロファイルを使用したサンプルのログバック構成です。

<configuration>

    <property name="LOG_LEVEL" value="INFO"/>

        <if condition='"product".equals("${spring.profiles.active}")'>
           <then>
                <property name="LOG_LEVEL" value="INFO"/>
           </then>
           <else>
                <property name="LOG_LEVEL" value="ERROR"/>
           </else>
        </if>

         .
         .
         appender, logger tags etc.
         .
         .

         <root level="${LOG_LEVEL}">
             <appender-ref ref="STDOUT"/>
         </root>

</configuration>

また、pom.xmlにこれを追加する必要があるかもしれません

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.6</version>
</dependency>
4
javasenior

SpringはLogback XMLファイル内の次のタグ<springProperty/>をサポートしています。このタグは here で説明されています。これは、Springプロパティファイルから変数を簡単に追加できることを意味します。この変数値でも、Springによって環境/システム変数から解決されます。

3
Andriy Rymar

異なるプロファイルに対して異なるlogback.xmlを指定できます。3つのステップのみです。

1、application.propertiesまたはapplication.ymlでアクティブなプロファイルを指定します。

spring.profiles.active: test

2、プロファイルごとに異なる構成を含む構成ログバック:

<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="30 seconds">
    <springProperty scope="context" name="profile" source="spring.profiles.active"/>
    <include resource="logback.${profile}.xml"/>
</configuration>

3、構成ファイルを作成しますlogback.test.xml

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <root level="INFO"/>
</included>

それは非常に簡単で、他に何もする必要はありません。

0
sulin