web-dev-qa-db-ja.com

ログバックとSpringBootの新しいspringPropertyルックアップメカニズムが機能しない

Spring-CloudBrixton.M2​​を介してSpringBoot 1.3.0.RC1を使用していますが、この機能チェックインによって示されるように、Spring Bootプロパティをlogback.xmlにプルできませんでした ログバック構成でspringPropertyをサポート

.ymlファイルを使用していて、bootstrap.ymlまたはapplication.ymlからアプリケーション名を取得したいと思います。

logback-spring.xml:

<configuration>
      <springProperty scope="context" name="myappName" source="spring.application.name"/>
      <contextName>${myappName}</contextName>
      <appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>logs/${myappName}.log</file>
         ... 
      </appender>
      ...
</configuration>

ここのドキュメント Spring Boot Logbackextensions はあまり役に立ちません。

この他のstackoverflowの質問 logback.xmlでSpringプロパティプレースホルダーを使用できません は古く、私にとっても機能しません。どんな洞察も役に立ちます。

リクエストごとに、使用されている関連する依存関係ツリーは次のとおりです

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.3.0.RC1:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:1.3.0.RC1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:1.3.0.RC1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.3.0.RC1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.3.0.RC1:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.1.3:compile
[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.1.3:compile
[INFO] |  |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.12:compile
[INFO] |  |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.12:compile
[INFO] |  |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.12:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.16:runtime

2回目の情報要求ごとに、実際に行われているのは、ログバックプロパティmyappNameが値を取得しないことです。私がこれを知っている方法は、値が「myappName_IS_UNDEFINED」になり、ログファイルの名前が「myappName_IS_UNDEFINED.log」になり、%contextNameが「myappName_IS_UNDEFINED」に設定されることです。

8
RubesMN

私の分析と将来の読者のための解決策を提供するために...私は_spring.application.name_の_bootstrap.yml_値、次に_application.yml_、次に_application.properties_で試しましたが、どれも機能しませんでした。 _logback.xml_を使用したためだと思いましたが、_logback-spring.xml_に変換しても変化はありませんでした。コミットされたコードを見ると ここthis.environment.getProperty(source)を介して値をプルすることは、プロパティソースがロードされるタイミングと_logback-spring.xml_ファイルが解釈されるタイミングに依存します。 Dave Syerがそれを機能させることができた理由はわかりませんが、ローカルプロパティソースが環境に追加される前に、私の.xml変数が入力されました。

SpringApplication.setDefaultProperties()を介して設定した場合、値は.xmlファイル内に入力されます。したがって、それが私がたどったルートです。

  • SpringApplicationRunListenerを構築しました
  • SpringApplicationRunListener.started()で、new ClassPathResource("/bootstrap.yml")を介してbootstrap.yml(すべてのフレームワークユーザーにspring.application.nameが必要)を読み込みました。
  • 値に基づいてHashMapに新しいプロパティ_service.log.name_を設定します
  • そのHashMapでSpringApplication.setDefaultProperties()と呼ばれる
  • その後、_${myappName}_ファイル内で_logback-spring.xml_を使用することができました

これは完璧な解決策ではないことを認めますが、現時点では機能し、springBootの将来のリリースでも機能し続ける可能性があります。私はさらなるアイデアを受け入れていますが、同じ経験をしている他の人のために働く解決策を提供したいと思いました。

8
RubesMN

まず、ファイルがxmlまたはgroovy形式であるかどうかに関係なく、ログバック構成ファイル名には-springという接尾辞を付ける必要があります。

springでは、config centerが優先され、次にコマンドライン引数、次にbootstrap.ymlのローカルプロパティとすべてのローカルプロパティファイルが優先されます。

複数の構成ファイルに多くのプロパティがある場合、最初のプロパティは値に関係なく影響します。

ちなみに、EnvironmentPreparedイベントが発生する前に、プログラムでログバック設定がないことを確認してください。ログバック設定がリセットされます。一方、複数のSpringコンテキストがある場合、ログバック設定はコンテキストごとに数回リセットされます。

これらのルールをチェックして、すべてのステップが制御されていることを確認してください。

2
Gemini Keith

私はSpringBoot 1.3.1を使用していますが、同じ問題に直面していました。

私が最終的に見つけたのは、プロパティはapplication.ymlとbootstrap.ymlの両方で設定する必要があるということでした。どちらか一方だけに設定しても機能しません。 -D引数としてのみ渡すこともできます。

ただし、特にプロファイルごとに構成されている場合は、二重構成にするのは少し面倒です。

おそらく、両方のフェーズでログバック構成が必要であり、プロパティ値は引き継がれません。

2
nedenom

Springアプリ名にアクセスするには、まずlogback-spring.xmlで以下に示すようにspringプロパティを定義する必要があります。

<springProperty scope="context" name="MyApp" source="com.app.star"/>

したがって、上記のソースにアクセスしている場合は、論理的には以下のようにapplication.ymlファイルで定義する必要があります。

com: app: star: HelloWorld

# Logging Configurations logging: config: "classpath:logback-spring.xml"


logback-spring.xmlで、appNameは{MyApp}でアクセスできる「HelloWorld」という名前で設定されます。

上記の説明がお役に立てば幸いです。

2

私たちの解決策は、logback(-spring).xmlの名前をたとえばに変更することです。 logback-delayed.xml Spring Cloud Configの前に読み取られないようにし、後でCloudConfigリポジトリの構成ファイルから明示的にアクティブ化します。例:

logging:
    config: classpath:logback-delayed.xml
    prop-to-fill-in-logback-delayed.xml: whatever

Logback-delayed.xmlで変数を宣言する

<springProperty scope="context" name="localName" source="prop-to-fill-in-logback-delayed.xml"/>

Logback-delayed.xmlの変数の使用

<file>${localName}.log</file>
2
LIU ShouHai

私にとっては、-property.value = asdのようなコマンドラインプロパティを使用した場合にのみ機能しました。

0

「spring.application.name」を「application.properties」に入れれば(「bootstrap.properties」ではなく、ロギングシステムがbootstrap properties)のフェーズで初期化されるため、うまくいきます。まだ利用できないと思います)ログバックで「コンテキスト」名を設定することはできないと思いますが、YMMVです。

0
Dave Syer

これをログバックファイルに追加するだけです。

<property resource="application.properties" />
0
Cheese

Bootstrap.propertiesでのみ更新した後、それは私のために働きました。 application.propertiesの更新は機能せず、また必要ありません。

kafka.Host.name=xxxxx
kafka.Host.port=9092

Logback.xml内

<springProperty scope="context" name="kafkaHostName" source="kafka.Host.name" /> 

<springProperty scope="context" name="kafkaHostPort" source="kafka.Host.port" />

  <appender name="asyncXSPKafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder class="com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </layout>
        </encoder>
        <topic>logstash_logs</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.RoundRobinKeyingStrategy" />
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" />
        <producerConfig>bootstrap.servers=**${kafkaHostName}:${kafkaHostPort}**</producerConfig>
        <producerConfig>retries=2</producerConfig>
    </appender>
0
sivakadi