如何在Spring Boot Actuator的Trace中包含JSON响应体?

时间:2016-03-07 16:23:58

标签: json spring spring-boot trace spring-boot-actuator

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

3 个答案:

答案 0 :(得分:4)

最近,我写了一篇blog post关于Spring Boot Actuator trace端点的定制,在玩Actuator时,我很惊讶response body不是要跟踪的受支持属性之一。

我认为我可能需要此功能,并且感谢Logback的TeeFilter提供了快速解决方案。

为了复制回复的输出流,我复制并使用了TeeHttpServletResponseTeeServletOutputStream而没有经过太多考试。

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

@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 responseBody端点服务中看到trace

答案 1 :(得分:0)

从弹簧维护者之一:

从来没有支持跟踪请求和响应正文。取消了对跟踪参数的支持,因为在将请求发布到表单数据后,它需要读取整个请求正文。

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

答案 2 :(得分:0)

使用webflux反​​应堆,可以使用spring-cloud-gateway捕获http请求和响应正文,并通过定义自定义HttpTraceWebFilter将它们注入到执行器@if (User.Identity.IsAuthenticated) { <a class="button" asp-controller="Account" asp-action="Logout">Sign Out</a> } else { <a class="button" asp-page="/Accounts/Login"> Sign in </a> } 中。

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

这需要很多重复,希望springboot团队会减少重复,请参见相关的https://github.com/spring-projects/spring-boot/issues/23907