Java Spring boot-如何将500响应主体记录到控制台

Java Spring boot-如何将500响应主体记录到控制台,java,spring,logging,Java,Spring,Logging,我已经为spring创建了一个过滤器(使用spring boot v1.5),它在每次请求时都会使用OncePerRequestFilter触发,如下所示: @Component class LogRequestFilter extends OncePerRequestFilter { private static final Logger logger = LoggerFactory.getLogger(LogRequestFilter.class); @Override

我已经为spring创建了一个过滤器(使用spring boot v1.5),它在每次请求时都会使用OncePerRequestFilter触发,如下所示:

@Component
class LogRequestFilter extends OncePerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(LogRequestFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
        ContentCachingResponseWrapper wrappedResponse = new ContentCachingResponseWrapper(response);

        int responseStatus = wrappedResponse.getStatusCode();

        if (responseStatus == 500) {
            String requestUri = wrappedRequest.getRequestURI();
            byte[] responseBodyBytes = wrappedResponse.getContentAsByteArray();
            logger.error("{}, {}, {}", responseStatus, requestUri, new String(responseBodyBytes));
        }

        filterChain.doFilter(wrappedRequest, response);
    }
}
我的问题是,当发生错误时,我需要记录响应主体。但是,即使用户从spring收到以下响应,我也无法从getContentAsByteArray()获取任何数据:

{
    "timestamp": 1512745726835,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "java.lang.NullPointerException",
    "message": "No message available",
    "path": "/documents/2017-02-17"
}

在调试时,我可以看到请求URI是正确的,但是缺少响应体。我如何解决这个问题

在阅读
wrappedResponse
的内容之前,移动
doFilter
方法调用。
在最后的调用
wrappedResponse.copyBodyToResponse()

检查一下,他正在使用的ContentCachingResponseRapper正是为这种情况而设计的。在没有文档的情况下使用它有点棘手。@Gorazd我同意,刚刚投票给你,我认为你可以为下一个人显示代码。我发现我可以使用上面的代码访问结果为200 OK的所有请求。只有500个响应主体没有传递到过滤器。我认为没有主体