Как регистрировать HTTP-обмены (включая полезные нагрузки) в spring-boot с помощью spring-web

#spring-boot #spring-mvc

#spring-boot #spring-mvc

Вопрос:

Есть ли какой-либо способ регистрировать полные HTTP-обмены (запрос ответ, включая заголовки полезные нагрузки) в службе spring-web REST?

Я видел CommonsRequestLoggingFilter, но он регистрирует только запрос. Есть ли соответствующий CommonsResponseLoggingFilter? Или другое решение?

В Джерси эта функциональность обеспечивается LoggingFeature, вам просто нужно ее включить.

Для HTTP-сервера я использую Tomcat по умолчанию. Есть AccessLogValve, но он не регистрирует полезную нагрузку.

В идеале я хотел бы что-то на уровне spring-web, похожее на Джерси, поэтому мне не нужно беспокоиться об этом, если я переключусь с Tomcat на Jetty или Undertow.

Ответ №1:

Я не уверен, есть ли у spring какой-либо встроенный фильтр, который помогает регистрировать оба запроса / ответа.

Но вы можете написать настраиваемый фильтр, чтобы сделать это.

 @Component
public class CustomLoggingFilter extends GenericFilterBean {
@Override
  public void doFilter(
      final ServletRequest req,
      final ServletResponse res,
      final FilterChain chain)
      throws IOException, ServletException {
    CachedBodyHttpServletRequest reqWrap = new CachedBodyHttpServletRequest(
        (HttpServletRequest) req);
    ContentCachingResponseWrapper resWrap = new ContentCachingResponseWrapper(
        (HttpServletResponse) res);
    chain.doFilter(reqWrap, resWrap);
    resWrap.copyBodyToResponse();
  }
}
 

CachedBodyHttpServletRequest и ContentCachingResponseWrapper могут помочь вам многократно получать доступ к заголовкам / данным и выполнять несколько протоколирований без нарушения каких-либо данных.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/ContentCachingRequestWrapper.html

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/ContentCachingResponseWrapper.html