2017-05-04 2 views
2

私はカスタムシステムを開発しています。私たちが分散システムに持っているすべてのスプリングブートアプリケーションの自動構成を提供する目的で、構成を変更する必要があるときは、変更を適用するすべてのアプリケーションを横断するのではなく、一箇所で行うことができます。代わりに、依存性のバージョンの更新だけで十分です。私は今、logbackするこだわりのため、ログおよびトレースを分散さをカバーしたいトピック以来ロギングと分散トレースのためのSpringブートカスタムスターター

、将来的にもlog4j2サポートを提供することを考えて、スターターは、次の依存関係が含まれています

  • spring-boot-starter-web
  • この上
  • spring-cloud-starter-sleuth

私の最初のテイクは、スターターの自動構成モジュールのsrc/main/resourcesフォルダにlogback.xmlファイルを含めるようにしましたスターターを消費するアプリケーションが構成を取得します。

スルースがクラスパスにあるときに私がいる問題はEnvironmentPostProcessorが[app name, traceId, spanId, exported]タプル、bootstrapの代わりに、アプリケーション内のspring.application.nameで定義された名前で表示されるアプリ名を持つレベルのパターンを更新したときに、あります。この問題を解決するためのスターターを使用して、アプリケーションのYMLファイルではなく、必ず理由を、理由の手掛かりを見つけることができませんでした:(

だから、私は次のようでした:

とパターン ${LOG_LEVEL_PATTERN:-%5p}に置き換え
  • %5pと追加してくださいパターンでは、[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]
  • を使用して、トレース情報を@Value("${spring.application.name}")、次にMDC#putというアプリケーション名でオートワイヤリングするフィルタを使用します。

私は、このアプローチはHTTPリクエストに対してのみ機能するが、それ以外の方法はありませんので、アプリケーションがJMS/Spring Cloud Streamとの非同期通信も利用するので、それは十分ではないことに気付きました。

次に、アプリケーション名をMDCに追加することを考えました.ApplicationContextInitializerは、すべてのユースケース(HTTPリクエスト、メッセージングなど)で利用できると考えていました。しかし残念なことに、アプリケーションの起動時にログの値が表示され、HTTPリクエスト(メッセージはまだ試していませんが、そこには存在しないという感覚です)の値は消えました。

私は一種のこだわっていると、それが見えることができますので、何がMDCにspring.application.nameの値を取得達成するための最良の方法/メカニズムになり、見て他にどこかわからないので、だから、質問が、ありますすべてのログに?

ありがとうございます!

答えて

1

bootstrap.ymlに名前を付けるだけで十分です。そうすれば、すべてのログに春のアプリケーション名が表示されます。

関連する問題