Python FastAPI で生の HTTP リクエスト/レスポンスをログに記録する方法?
FastAPI には、生の HTTP リクエストとレスポンスをキャプチャしてログに記録するためのいくつかの方法が用意されています。特定の要件とパフォーマンスに関する考慮事項に対応します。
オプション 1:ミドルウェア
ミドルウェアを使用すると、リクエストと応答をインターセプトして処理できます。リクエスト本文をストリームで消費して保存するミドルウェアを作成できます。応答本文の場合は、それをバイト オブジェクトに読み取り、カスタム応答を返します。応答時間への影響を避けるために、BackgroundTask を使用してデータを非同期に記録します。
例:
async def some_middleware(request: Request, call_next): req_body = await request.body() response = await call_next(request) res_body = b'' async for chunk in response.body_iterator: res_body += chunk task = BackgroundTask(log_info, req_body, res_body) return Response(content=res_body, background=task)
オプション 2: カスタム APIRoute クラス
リクエストとレスポンスの本文を操作するカスタム APIRoute クラスを作成します。このアプローチにより、APIRouter で定義された特定のルートへのログ記録を制限できます。
例:
class LoggingRoute(APIRoute): async def custom_route_handler(request: Request) -> Response: req_body = await request.body() response = await original_route_handler(request) res_body = b'' async for item in response.body_iterator: res_body += item task = BackgroundTask(log_info, req_body, res_body) response = Response(content=res_body, background=task) return response
大規模なリクエスト/レスポンス本文を保存する場合の制限を考慮してください。メモリを確保し、BackgroundTask を使用してリクエスト処理のブロックを回避します。必要に応じて、ログ記録を特定のルートに制限するか、ストリーミング応答を返すエンドポイントを除外します。
以上がPython FastAPI で生の HTTP リクエストとレスポンスをログに記録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。