当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot执行器的跟踪中包含JSON响应体?

堵乐
2023-03-14

Spring Boot Actuator的Trace在捕获输入/输出HTTP参数、标头、用户等方面做得很好。我想扩展它以也捕获HTTP响应的主体,这样我就可以全面了解Web层的进出情况。查看TraceProperties,看起来没有一种方法可以配置响应主体捕获。是否有一种“安全”的方法可以捕获响应主体而不会弄乱它发送回的任何字符流?

共有3个答案

夹谷山
2023-03-14

通过webfluxReactor栈,可以使用spring cloud gateway捕获http请求和响应体,并通过定义自定义HttpTraceWebFilter将其注入到执行器中。

在https://gist.github.com/gberche-orange/06c26477a313df9d19d20a4e115f079f查看完整的相关代码

这需要相当多的重复,希望springboot团队能够帮助减少这种重复,请参阅相关内容https://github.com/spring-projects/spring-boot/issues/23907

易星纬
2023-03-14

来自一位Spring维修人员:

跟踪请求和响应主体从来没有得到过现成的支持。对跟踪参数的支持被放弃,因为当请求被传递到表单数据时,它需要读取整个请求正文。

https://github.com/spring-projects/spring-boot/issues/12953

段兴为
2023-03-14

最近,我写了一篇关于自定义Spring Boot Actuator的跟踪endpoint的博客文章,在玩Actuator时,我有点惊讶响应体不是要跟踪的受支持属性之一。

我想我可能需要这个功能,多亏了Logback的TeeFilter,我找到了一个快速的解决方案

为了复制响应的输出流,我复制并使用了TeeHttpServletACK和TeeServletOutputStream,没有进行太多检查。

然后,就像我在博客文章中解释的那样,扩展WebRequest estTraceFilter如下:

@Component
public class RequestTraceFilter extends WebRequestTraceFilter {

    RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
        super(repository, properties);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response);

        filterChain.doFilter(request, teeResponse);

        teeResponse.finish();

        request.setAttribute("responseBody", teeResponse.getOutputBuffer());

        super.doFilterInternal(request, teeResponse, filterChain);
    }

    @Override
    protected Map<String, Object> getTrace(HttpServletRequest request) {
        Map<String, Object> trace = super.getTrace(request);

        byte[] outputBuffer = (byte[]) request.getAttribute("responseBody");

        if (outputBuffer != null) {
            trace.put("responseBody", new String(outputBuffer));
        }

        return trace;
    }
}

现在,您可以在JSON跟踪服务中看到响应库。

 类似资料:
  • 有没有更好的方法来追踪电话的时间?

  • 我希望在spring boot中返回类似以下内容的json响应: 我的RestController如下所示 但我得到的反应是这样的

  • 当规则应用程序在KIE服务器上运行时,如何启用规则引擎跟踪/日志记录? 规则应用程序是在工作台中创建的,不包含自定义代码。我能够使用KIE REST API执行规则,但是规则应用程序没有产生预期的结果。 环境: 我尝试了以下步骤: 使用Git在本地克隆工作台项目 将logback.xml添加到项目的根目录 将更改推回到工作台git repo 在工作台项目编辑器视图中添加了日志作为依赖项 更新项目版

  • 我有自己的异常扩展,当调用时,我希望它向浏览器输出一条消息。但是,当我抛出这个异常时,抓住它并输出消息,但消息是一个跟踪。 这是我的全球。php: 我的代码片段: 输出到浏览器: 异常'异常'消息'密码未设置'在 /Users/kevin/Documents/Web/app/controllers/Settings/SetupController.php: 8堆栈跟踪:#0[内部功能]: Setu

  • 我正在尝试使用Laravel框架构建REST api,我想要一种强制api始终使用JSON响应的方法,而不是手动执行以下操作: 换句话说,我希望每个响应都是JSON。有什么好办法吗? 更新:响应必须是JSON,即使在异常(如not found exception)上也是如此。