【问题标题】:Spring boot - How to log 500 response body to consoleSpring Boot - 如何将 500 响应正文记录到控制台
【发布时间】:2017-12-08 15:12:30
【问题描述】:

我为 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 是正确的,但缺少响应正文。我该如何解决这个问题?

【问题讨论】:

  • 签出this answer
  • 他正在使用专为这种情况设计的 ContentCachingResponseWrapper。在没有文档的情况下使用它有点棘手。
  • @Gorazd 我同意,刚刚投了你一票,我想你可以为下一个人展示代码。
  • 我发现我可以使用上面的代码访问所有导致 200 OK 的请求。只有 500 响应正文没有传递给过滤器。
  • 我认为没有身体

标签: java spring logging


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2017-12-23
    • 2017-10-10
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多