如何在 spring rest 中记录所有请求响应?

新手上路,请多包涵

应用程序应在不影响客户端的情况下异步记录以下信息(在单独的线程中)。

  • 请求 HTTP 方法和 URI
  • 请求标头(默认除外)
  • 客户的 IP 地址
  • 请求处理时间(以毫秒为单位)
  • 请求正文
  • 响应体

如果我们在过滤器中消费了 inputstream ,那么spring就不能再次消费它来进行json到对象的映射。在输入流到对象映射的某个地方,我们可以插入我们的记录器吗?

更新:

我们可以在 MessageConverter 中重写日志代码,但这似乎不是一个好主意。

 public class MyMappingJackson2MessageConverter extends AbstractHttpMessageConverter<Object> {
    ...
    protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
        InputStream inputStream = inputMessage.getBody();
        String requestBody = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
        String method = request.getMethod();
        String uri = request.getRequestURI();
        LOGGER.debug("{} {}", method, uri);
        LOGGER.debug("{}", requestBody);
        return objectMapper.readValue(requestBody, clazz);
    }

    protected void writeInternal(Object o, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        String responseBody = objectMapper.writeValueAsString(o);
        LOGGER.debug("{}", responseBody);
        outputMessage.getBody().write(responseBody.getBytes(StandardCharsets.UTF_8));
    }
}

原文由 Nilesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 501
1 个回答

来自 baeldung.com 的回答:

Spring 提供了一个内置的解决方案来记录有效负载。我们可以通过使用配置插入 Spring 应用程序来使用现成的过滤器。 AbstractRequestLoggingFilter 是一个提供日志记录基本功能的过滤器。子类应覆盖 beforeRequest()afterRequest() 方法以围绕请求执行实际日志记录。 Spring 框架提供了以下具体实现类,可用于记录传入请求。这些是:

可以通过添加 bean 定义来配置 Spring Boot 应用程序以启用请求日志记录:

 @Configuration
public class RequestLoggingFilterConfig {

    @Bean
    public CommonsRequestLoggingFilter logFilter() {
        CommonsRequestLoggingFilter filter
          = new CommonsRequestLoggingFilter();
        filter.setIncludeQueryString(true);
        filter.setIncludePayload(true);
        filter.setMaxPayloadLength(10000);
        filter.setIncludeHeaders(false);
        filter.setAfterMessagePrefix("REQUEST DATA : ");
        return filter;
    }
}

此外,此日志过滤器需要将日志级别设置为 DEBUG。在 application.properties

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG

为了使日志记录异步,我们可以使用 异步 appenders 。不幸的是,它不支持记录响应负载。 :(

原文由 Nilesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题