【问题标题】:Logging filter response with body for REST使用 REST 正文记录过滤器响应
【发布时间】:2018-03-24 13:51:55
【问题描述】:

我正在尝试使用主体记录我的 REST 服务的所有请求和响应。 到目前为止,对于记录请求,我正在使用 Spring 内置的解决方案来记录有效负载 RequestLoggingFilterConfig,并且效果很好。

现在我正在为日志响应寻找类似的解决方案。 问题是如何从 REST 中记录整个响应的正文,并且只能通过配置文件来完成?

我的请求配置

@Configuration
public class RequestLoggingFilterConfig {

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

和 application.properties

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

【问题讨论】:

    标签: java spring rest spring-boot logging


    【解决方案1】:

    application.properties logging.level.* 帮助刚刚配置了您的日志记录级别,用于处理日志记录响应, 您需要某种可以拦截您的响应的中间件

    1:自定义过滤器过滤器是处理此问题的最佳方法之一 例如:

        @Component
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public class WebFilter implements Filter {
    
            private static final Logger logger = LoggerFactory.getLogger(WebFilter.class);
    
            private static final boolean CONDITION = true;
    
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {
                logger.debug("Initiating WebFilter >> ");
            }
    
            @Override
            public void doFilter(ServletRequest request, ServletResponse response,
                    FilterChain chain) throws IOException, ServletException {
    
                    chain.doFilter(requestWrapper, response); 
    
                    // log your response here
            }
    
            @Override
            public void destroy() {
                logger.debug("Destroying WebFilter >> ");
            }
        }
    
    register your filter 
    @Bean
    public FilterRegistrationBean someFilterRegistration() {
    
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(someFilter());
        registration.addUrlPatterns("/api/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("someFilter");
        registration.setOrder(1);
        return registration;
    } 
    
    public Filter someFilter() {
        return new WebFilter();
    }
    
    
    2:InterceptorAdapter
    

    您可以扩展 HandlerInterceptorAdapter 并覆盖 afterCompletion 方法 完成后的公共无效,

    @Component
    public class LogginInterceptor 
      extends HandlerInterceptorAdapter {
    
        @Override
        public void afterCompletion(
          HttpServletRequest request, 
          HttpServletResponse response, 
          Object handler, 
          Exception ex) {
            // log your response here
        }
    }
    

    3:AOP 你也可以使用神奇的 AOP 来处理使用 @After 的响应 实现

    【讨论】:

    • 我已经尝试过使用 afterCompletion 的方法,但到目前为止我得到的唯一回应是类似[afterCompletion] org.apache.catalina.connector.ResponseFacade@37c00390
    • HttpServletResponse 没有覆盖 toString 方法,这就是它打印这个响应类名的原因,如果你把这篇文章扔掉,你会得到如何记录请求/响应stackoverflow.com/questions/33744875/…
    猜你喜欢
    • 2017-02-21
    • 2012-07-28
    • 1970-01-01
    • 2010-10-27
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2023-03-10
    相关资源
    最近更新 更多