私は Spring Boot で REST API に取り組んでいます。入力パラメータ (メソッド、例: GET、POST など)、リクエスト パス、クエリ文字列、このリクエストに対応するクラス メソッド、このアクションの応答 (成功とエラーの両方) を含むすべてのリクエストをログに記録する必要があります。例:
リクエストが成功しました:
http://example.com/api/users/1
ログは次のようになります。
{
HttpStatus: 200,
path: "api/users/1",
method: "GET",
clientIp: "0.0.0.0",
accessToken: "XHGu6as5dajshdgau6i6asdjhgjhg",
method: "UsersController.getUser",
arguments: {
id: 1
},
response: {
user: {
id: 1,
username: "user123",
email: "[email protected]"
}
},
exceptions: []
}
またはエラーのあるリクエスト:
http://example.com/api/users/9999
ログは次のようになります。
{
HttpStatus: 404,
errorCode: 101,
path: "api/users/9999",
method: "GET",
clientIp: "0.0.0.0",
accessToken: "XHGu6as5dajshdgau6i6asdjhgjhg",
method: "UsersController.getUser",
arguments: {
id: 9999
},
returns: {
},
exceptions: [
{
exception: "UserNotFoundException",
message: "User with id 9999 not found",
exceptionId: "adhaskldjaso98d7324kjh989",
stacktrace: ...................
]
}
リクエスト/レスポンスを、成功の場合もエラーの場合も、このエンティティに関連するカスタム情報を含む単一のエンティティにしたいと考えています。
これを実現するための Spring のベスト プラクティスは何ですか? フィルターを使用するなどでしょうか? そうであれば、具体的な例を挙げていただけますか?
私は@ControllerAdvice
とを試してみました@ExceptionHandler
が、前述したように、すべての成功リクエストとエラーリクエストを 1 か所 (および 1 つのログ) で処理する必要があります。
ベストアンサー1
インターセプター、フィルター、コンポーネント、アスペクトなどを記述しないでください。これは非常に一般的な問題であり、何度も解決されてきました。
Spring Bootには、アクチュエータ/trace
は、HTTP リクエストのログ記録をすぐに提供します。 (SB1.x) または(SB2.0+)にマップされたエンドポイントがあり、/actuator/httptrace
最新の 100 件の HTTP リクエストが表示されます。各リクエストをログに記録したり、DB に書き込んだりするようにカスタマイズできます。
必要なエンドポイントを取得するには、spring-boot-starter-actuator 依存関係が必要であり、また、探しているエンドポイントを「ホワイトリスト」に追加し、必要に応じてセキュリティを設定または無効にする必要があります。
また、このアプリケーションはどこで実行されますか? PaaS を使用しますか? Heroku などのホスティング プロバイダーは、サービスの一部としてリクエスト ログを提供するため、コーディングは一切必要ありません。