0

最近まで、私は spring-boot 1.3.5.RELEASE を使用していましたが、以下が機能しました。

@SpringBootApplication
public class MyApplication {
    static {
        MDC.put("service_name", "myapp");
    }
    public static void main(String[] args) {
        SpringApplication.run(new Object[]{MyConfiguration.class}, args);
    }
}

MDC put に注意してください。次に、logback logger を使用して、アプリケーション全体の各ログ行に service_name が記録されました。これは、MVC コントローラーなどの子スレッドでも当てはまりました。

現在、Spring バージョン 1.4.1.RELEASE を使用しており、service_name の MDC ロギングはメイン スレッドでのみ機能し、MVC コントローラー スレッドでは機能しません。

「myapp」はまだメイン スレッドに記録されています。

2016-11-30 14:22:08,147 [main] INFO  co.uk.me.MyApplication - myapp [,,] - Started MyApplication in 14.276 seconds (JVM running for 308.404)

しかし、コントローラーのログ行に「myapp」がありません。

2016-11-30 15:17:50,329 [http-nio-9007-exec-2] INFO  co.uk.me.controller.MyController -  [,,] - Received get <snip>

変更前は次のように見えました。

2016-11-30 15:17:50,329 [http-nio-9007-exec-2] INFO  co.uk.me.controller.MyController - myapp [,,] - Received get <snip>

コントローラー メソッドの開始時に MDC コンテキストが空であることをデバッガーで確認できます。

この動作に影響を与えた変更を知っている人はいますか? おそらく、Spring MVC スレッド作成への変更でしょうか? それともログバックの変更?アプリケーション全体の MDC プロパティを設定して保持する方法はありますか?

ありがとう

4

1 に答える 1

0

MDC 値はスレッド ローカルに保持されるため、Spring Boot アプリを開始するメイン スレッドのみが値を持ちます。MDC は通常、動的コンテンツに使用され、静的コンテンツには使用されません (アプリケーション名は変更されません)。着信要求ごとに MDC 値を入力するフィルターを追加できます。

logback-spring.xml ファイルで次のようなものを使用することをお勧めします。

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%date [myapp] [%thread] %-5level %logger{36} - %msg%xEx%n</Pattern>
        </encoder> 
于 2017-02-28T10:02:18.083 に答える