マイクロサービス分散アーキテクチャでリクエスト/レスポンスのログを効率的に収集する方法

この記事では、Spring Cloud マイクロサービスがマイクロサービス間の通信フレームワークとして Feign を使用する場合に、有効な情報をより直感的にログに収集できるようにするための統合ログ印刷の構成方法を主に説明します。
(コア コードのスクリーンショットのみを以下に示します。詳細なコードは、github および gitee ウェアハウスを通じて参照できます。 コード ディレクトリは記事の最後に添付されています )

1. 単一サービスのリクエスト/レスポンスログの収集

1. フィルターを使用してリクエスト ログを出力する

2. ResponseBodyAdvice を使用して応答ログを出力します。

3. postman を使用して API をリクエストする

[ログ出力効果] ( chain.doFilterの後にlog.infoが実行されるため、ここでログが要求されます )
22:58:23.365 [16582427033635607] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":"2022-07-19 22:58:23"}
22:58:23.368 [16582427033635607] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/time header:{"x-platform":"app"},param:{"a":"1"},body:{"b":"bb"},4ms
さまざまなリクエストデータの印刷をサポートできます(リクエストヘッダー、URLパラメータ、ボディフォームパラメータ、ボディ生パラメータ、応答データを含む)

2. マイクロサービスのリクエスト/レスポンスログ収集 (Feign に基づく)

Feign は http カプセル化に基づいた通信フレームワークですが、呼び出し方法が異なるため、ログを補足するためにログ収集時に追加の操作を行う必要があります。
たとえば、現在のサービスはユーザー サービスの Feign インターフェイスを呼び出しており、ユーザー サービス クラスターは 3 台のマシンにデプロイされている場合、現在のサービスによって呼び出される次のノードがどのマシンであるかをすぐに知りたいとします。

1. FeignIPClient をカスタマイズして Client.Default を継承し、execute メソッドを書き換えて、出力するログを追加します。

同時に、Feignを呼び出している現在のサービスのリクエストパラメータとレスポンス結果も知りたいです。

2. FeignClient アノテーションの側面を追加します。Feign の呼び出しはメソッドの呼び出しと同等であるため、AOP を使用して拡張できます。

同時に、Feign 呼び出し中に、現在のサービスのリクエスト ヘッダーの内容 (一部のパブリック リクエスト ヘッダー、ユーザー ID、リンク追跡ログ ID など) を次のサービスに渡すことができることも期待しています。

3. Feign が提供するインターセプター RequestInterceptor を使用し、RequestTemplate に移動して、Feign リクエストが開始されるときにヘッダーを設定します。

【現在のサービスログ】
​23:33:50.365 [16582448303481157] [hystrix-template-user-10]  INFO FeignIPClient.execute[42] - 13ms GET http://192.168.31.158:8002/user/getById?id=1
23:33:50.370 [16582448303481157] [http-nio-6001-exec-3]  INFO FeignCostTimeAspect.feignCostTime[30] - request feign:UserFeign.getById,mills:19,args:[1],result:{"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.373 [16582448303481157] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.377 [16582448303481157] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/getUserById header:{"x-platform":"app"},param:{"id":"1"},body:{},29ms
【ユーザーサービスのログ】
23:33:50.363 [16582448303481157] [http-nio-8002-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.366 [16582448303481157] [http-nio-8002-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /user/getById header:{"x-platform":"app"},param:{"id":"1"},body:{},6ms
【ログの説明】
FeignIPClient.execute
「出力されるログ行は、ターゲット ホストの IP + ポートです。
FeignCostTimeAspect.feignCostTime
「それが出力されるログ行は、Feign のリクエスト パラメーターと応答結果です。
ヘッダー:{"x-プラットフォーム":"アプリ"}
「RequestInterceptorによって渡されたリクエストヘッダーです」
どうでしょうか?役に立つと思ったら、遠慮せずに始めてください。
添付ファイル: 関連するコード ディレクトリ
github:https://github.com/897665787/springcloud-template
春雲テンプレート
└── テンプレートフレームワーク
     ━── アドバイス
          ━── LogResponseBodyAdvice -- 応答ログの統合印刷
     ━──アスペクト
          └── FeignCostTimeAspect -- Feign インターフェイスのリクエストに費やした時間を記録し、呼び出し元のログに出力します。
          ━── FeignIPClient -- 偽リクエストのターゲットマシン情報を出力します。
     └── 自動構成
          ━── LoadBalancerFeignClientAutoConfiguration -- FeignIPClient の自動構成
     └──フィルター
          └── RequestFilter -- リクエストパラメータのログ出力
     └── インターセプター
          ━── FeignHeaderInterceptor -- Feign 呼び出し中にヘッダー値を渡します

おすすめ

転載: blog.csdn.net/w13528476101/article/details/125947312