我正在使用 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: "user123@example.com"
}
},
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: ...................
]
}
我希望请求/响应是一个单一的实体,在成功和错误的情况下都有与该实体相关的自定义信息。
春季实现这一目标的最佳实践是什么,可能是过滤器?如果是,你能提供具体的例子吗?
我玩过 @ControllerAdvice
和 @ExceptionHandler
,但正如我所提到的,我需要在一个地方(和单个日志)处理所有成功和错误请求。
原文由 Teimuraz 发布,翻译遵循 CC BY-SA 4.0 许可协议
不要写任何拦截器、过滤器、组件、方面等,这是一个很常见的问题,已经解决了很多次。
Spring Boot 有一个名为 Actuator 的模块,它提供开箱即用的 HTTP 请求日志记录。有一个映射到
/trace
(SB1.x) 或/actuator/httptrace
(SB2.0+) 的端点,它将向您显示最后 100 个 HTTP 请求。您可以自定义它以记录每个请求,或写入数据库。要获得您想要的端点,您需要 spring-boot-starter-actuator 依赖项,还需要将您正在寻找的端点“列入白名单”,并可能为其设置或禁用安全性。
另外,该应用程序将在哪里运行?您会使用 PaaS 吗?托管服务提供商,例如 Heroku,将请求日志记录作为其服务的一部分提供,因此您无需进行 任何 编码。