当前位置: 首页 > 面试题库 >

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

韦高阳
2023-03-14
问题内容

从技术上来说,答案都不是。根据Java虚拟机规范,用于存储字符串文字的区域位于运行时常量池中。运行时常量池内存区域是按类或每个接口分配的,因此它根本不与任何对象实例绑定。运行时常量池是方法区域的子集,其中“存储每个类的结构,例如运行时常量池,字段和方法数据以及方法和构造函数的代码,包括用于类和实例初始化以及接口的特殊方法”类型初始化”。VM规范说,尽管方法领域 从逻辑上讲,它是堆的一部分,它并不指示在方法区域中分配的内存要进行垃圾回收或其他与分配给堆的常规数据结构相关的行为。我正在使用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: ...................    
       ]       
    }

我希望“请求/响应”是一个单独的实体,在成功和错误情况下都具有与此实体相关的自定义信息。

Spring最好的做法是使用过滤器?如果是,你能提供具体的例子吗?

(我玩过@ControllerAdvice和@ExceptionHandler,但是如上所述,我需要在一个地方(和一个日志)处理所有成功和错误请求)。


问题答案:

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

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

要获得所需的端点,您将需要spring-boot-starter-actuator依赖关系,并且还需要将要查找的端点“白名单”,并可能为其设置或禁用安全性。

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



 类似资料:
  • 我正在和spring boot一起开发rest api。我需要记录所有的请求与输入参数(与方法,如GET,POST等),请求路径,查询字符串,相应的类方法的请求,也响应这个动作,成功和错误。例如: 成功的请求: 日志应该如下所示: 或请求出错: 日志应该是这样的: 我希望请求/响应是一个单一的实体,与该实体相关的自定义信息,在成功和错误的情况下。 在spring实现这一点的最佳做法是什么,可能是与

  • 应用程序应异步(在单独的线程中)记录以下信息,而不会影响客户端。 请求HTTP方法和URI 如果我们在过滤器中使用,那么spring将无法再次使用它进行json到对象的映射。在输入流到对象映射期间的某个地方,我们可以插入记录器吗? 更新: 我们可以在MessageConverter中编写日志代码,但这似乎不是一个好主意。

  • 问题内容: 我需要所有已登录的SOAP请求,以及持续时间(处理请求所花费的时间)。 最好的方法是什么?看起来可以为Spring WebServices配置log4j,但是它将记录所有值吗? 将以下行添加到log4j.xml 编辑:我们实际上是在使用,而不是。另外,看起来可以通过配置PayloadLoggingInterceptor来做到这一点 但是我不确定日志消息会去哪里。我将该拦截器添加到了我们

  • 我只收到请求,没有回应。

  • 我将WireMock作为独立进程启动: Java-jar wiremock-standalone-2 . 6 . 0 . jar-port 8080-v 还行。 当超文本传输协议请求内容后缀时 /api/profile/Favorite/WireMock必须返回存根响应。对所有其他请求必须通过WireMock忽略,并且必须转发到正式服。 我必须如何配置WireMock?

  • 在Vertx WebClient中记录传出http请求和响应的最简单方法是什么。我正在寻找类似于httpserver LoggerHandler的东西,但接下来是webclient的输出请求。