【问题标题】:Logging all request and responses using Spring Boot Actuator使用 Spring Boot Actuator 记录所有请求和响应
【发布时间】:2019-03-26 09:19:35
【问题描述】:

我正在使用 @RestController 使用 Spring Boot 和 REST 服务。我想使用有效负载记录所有请求和响应。我怎样才能使用Spring Boot Actuator 做到这一点?当我使用:

    @Bean
    public ServletContextRequestLoggingFilter requestLoggingFilter() {
        ServletContextRequestLoggingFilter loggingFilter = new ServletContextRequestLoggingFilter();
        loggingFilter.setIncludeClientInfo(true);
        loggingFilter.setIncludeQueryString(true);
        loggingFilter.setIncludePayload(true);
        loggingFilter.setIncludeHeaders(true);
        loggingFilter.setMaxPayloadLength(10000);
        loggingFilter.setAfterMessagePrefix("REQUEST DATA : ");
        return loggingFilter;
    }

我只收到请求,但没有收到响应。

【问题讨论】:

标签: java spring-mvc spring-boot


【解决方案1】:

参见 baeldung Spring – Log Incoming Requests 指南,特别是第 5 节 Spring Built-In Request Logging

TL;DR 如果您使用的是 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;
    }
}

一般注意事项:在生产应用程序中,您应该小心记录有效负载,因为它们可能包含出于隐私考虑不应记录的私人用户数据。

【讨论】:

    【解决方案2】:

    你可以使用WebMvcConfigureraddInterceptors方法

    @Configuration
    @EnableWebMvc
    class WebMvcConfiguration : WebMvcConfigurer {
    
      override fun addInterceptors(registry: InterceptorRegistry) {
          registry.addInterceptor(LoggingInterceptor())
      }
    }
    

    here 是拦截器的好例子。

    更新

    您可以覆盖 Spring LoggingFilter

    public class CustomLoggingFilter extends LoggingFilter
    {
         @Override
         protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
         {
              super.doFilterInternal(request, response, filterChain);
         }
    }
    
    @Configuration
    public Config {
        @Bean
        public CustomLoggingFilter loggingFilter()
        {
            return new CustomLoggingFilter();
        }
    }
    

    不确定您的格式,但您可以尝试使用:

    logging:
      level: 
        org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor: debug //response
        org.apache.coyote.http11.Http11InputBuffer: debug //request
    

    【讨论】:

    • 我尝试这样:baeldung.com/spring-http-logging 但它对我不起作用,有效负载不记录!
    • 您的示例没有记录有效负载。没有有效载荷它很容易!
    • 我看到了。它使用DispatcherServlet,但我使用Spring Boot
    • 提供答案时,请确保它回答了问题中的要求,而不是类似(但不同)的要求(您的解决方案不记录有效负载,并且提供的链接不使用 Spring Boot)跨度>
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多