Spring Boot - 如何在一个地方记录所有带有异常的请求和响应?

新手上路,请多包涵

我正在使用 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 许可协议

阅读 545
1 个回答

不要写任何拦截器、过滤器、组件、方面等,这是一个很常见的问题,已经解决了很多次。

Spring Boot 有一个名为 Actuator 的模块,它提供开箱即用的 HTTP 请求日志记录。有一个映射到 /trace (SB1.x) 或 /actuator/httptrace (SB2.0+) 的端点,它将向您显示最后 100 个 HTTP 请求。您可以自定义它以记录每个请求,或写入数据库。

要获得您想要的端点,您需要 spring-boot-starter-actuator 依赖项,还需要将您正在寻找的端点“列入白名单”,并可能为其设置或禁用安全性。

另外,该应用程序将在哪里运行?您会使用 PaaS 吗?托管服务提供商,例如 Heroku,将请求日志记录作为其服务的一部分提供,因此您无需进行 任何 编码。

原文由 SergeyB 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题