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」に設定されることです。
私の分析と将来の読者のための解決策を提供するために...私は_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.started()
で、new ClassPathResource("/bootstrap.yml")
を介してbootstrap.yml(すべてのフレームワークユーザーにspring.application.nameが必要)を読み込みました。service.log.name
_を設定しますSpringApplication.setDefaultProperties()
と呼ばれる${myappName}
_ファイル内で_logback-spring.xml
_を使用することができましたこれは完璧な解決策ではないことを認めますが、現時点では機能し、springBootの将来のリリースでも機能し続ける可能性があります。私はさらなるアイデアを受け入れていますが、同じ経験をしている他の人のために働く解決策を提供したいと思いました。
まず、ファイルがxml
またはgroovy
形式であるかどうかに関係なく、ログバック構成ファイル名には-spring
という接尾辞を付ける必要があります。
springでは、config centerが優先され、次にコマンドライン引数、次にbootstrap.yml
のローカルプロパティとすべてのローカルプロパティファイルが優先されます。
複数の構成ファイルに多くのプロパティがある場合、最初のプロパティは値に関係なく影響します。
ちなみに、EnvironmentPrepared
イベントが発生する前に、プログラムでログバック設定がないことを確認してください。ログバック設定がリセットされます。一方、複数のSpringコンテキストがある場合、ログバック設定はコンテキストごとに数回リセットされます。
これらのルールをチェックして、すべてのステップが制御されていることを確認してください。
私はSpringBoot 1.3.1を使用していますが、同じ問題に直面していました。
私が最終的に見つけたのは、プロパティはapplication.ymlとbootstrap.ymlの両方で設定する必要があるということでした。どちらか一方だけに設定しても機能しません。 -D引数としてのみ渡すこともできます。
ただし、特にプロファイルごとに構成されている場合は、二重構成にするのは少し面倒です。
おそらく、両方のフェーズでログバック構成が必要であり、プロパティ値は引き継がれません。
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」という名前で設定されます。
上記の説明がお役に立てば幸いです。
私たちの解決策は、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>
私にとっては、-property.value = asdのようなコマンドラインプロパティを使用した場合にのみ機能しました。
「spring.application.name」を「application.properties」に入れれば(「bootstrap.properties」ではなく、ロギングシステムがbootstrap properties)のフェーズで初期化されるため、うまくいきます。まだ利用できないと思います)ログバックで「コンテキスト」名を設定することはできないと思いますが、YMMVです。
これをログバックファイルに追加するだけです。
<property resource="application.properties" />
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>