特定のルートの Python FastAPI での生の HTTP リクエスト/レスポンスのログ記録
問題:
私たちは開発中ですKubernetes にデプロイされる FastAPI を使用する Web サービス。監査の目的で、特定のルートのリクエストとレスポンスの生の JSON 本文をログに記録する必要があります。リクエストおよびレスポンスの JSON 本文のサイズは約 1MB で、ロギング プロセスが応答時間に大きな影響を与えないことが重要です。
解決策:
オプション 1: ミドルウェアを使用する
-
ミドルウェア:
関数を定義し、@app.middleware("http") デコレーターを使用して受信リクエストと送信応答を処理します。
-
キャプチャ リクエスト本文:
request.body() または request.stream() を使用してリクエスト本文をキャプチャします。
-
プロセス応答本文:
応答本文をバイト オブジェクトとして読み取り、カスタム応答をクライアントに返します。
-
ログ データ:
BackgroundTask を使用して、ファイルまたはデータベースへのリクエストおよびレスポンスの本文。
オプション 2: カスタムの使用APIRoute クラス
-
カスタム APIRoute の定義:
APIRoute 基本クラスを拡張するカスタム APIRoute クラスを作成し、リクエストおよびレスポンスの本文を変更できるようにします。
-
リクエスト本文の処理:
カスタム ルート ハンドラーでは、エンドポイント ハンドラーに到達する前にリクエスト本文をキャプチャします。
-
レスポンス本文の処理:
レスポンス本文を変更し、新しい Response オブジェクトを作成します。元の応答が StreamingResponse の場合、ストリーミング イテレータにロギング機能を追加します。
-
Background Logging:
ロギング関数を BackgroundTask として応答オブジェクトにアタッチします。
注:
リクエストのサイズを考慮してくださいペイロードが大きいと、サーバー側とクライアント側の両方でメモリの問題や遅延が発生する可能性があるためです。ログ記録を特定のルートに制限するか、ストリーミング応答をログ記録から除外することが必要な場合があります。
以上が監査のために生の HTTP リクエスト/レスポンス JSON を FastAPI に効率的に記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。