SpringBoot记录HTTP请求日志

https://juejin.cn/post/6844903666588057614

自定义HttpTraceFilter

在HttpTraceFilter继承了OncePerRequestFilter,我们可以仿照这个过滤器,定义自己的过滤器去继承OncePerRequestFilter,在doFilterInternal这个方法中获取到HttpServletRequest,HttpServletResponse,这样就可以获取到对应的请求参数和返回参数了。

  1. @Slf4j
  2. public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered {
  3. private static final String NEED_TRACE_PATH_PREFIX = "/api";
  4. private static final String IGNORE_CONTENT_TYPE = "multipart/form-data";
  5. private final MeterRegistry registry;
  6. public HttpTraceLogFilter(MeterRegistry registry) {
  7. this.registry = registry;
  8. }
  9. @Override
  10. public int getOrder() {
  11. return Ordered.LOWEST_PRECEDENCE - 10;
  12. }
  13. ... ...
  14. }

请求响应日志的常用手段

https://www.modb.pro/db/101981

CommonsRequestLoggingFilter

Spring Web模块还提供了一个过滤器CommonsRequestLoggingFilter,它可以对请求的细节进行日志输出。
配置起来也比较简单:

  1. @Bean
  2. CommonsRequestLoggingFilter loggingFilter(){
  3. CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();
  4. // 记录 客户端 IP信息
  5. loggingFilter.setIncludeClientInfo(true);
  6. // 记录请求头
  7. loggingFilter.setIncludeHeaders(true);
  8. // 如果记录请求头的话,可以指定哪些记录,哪些不记录
  9. // loggingFilter.setHeaderPredicate();
  10. // 记录 请求体 特别是POST请求的body参数
  11. loggingFilter.setIncludePayload(true);
  12. // 请求体的大小限制 默认50
  13. loggingFilter.setMaxPayloadLength(10000);
  14. //记录请求路径中的query参数
  15. loggingFilter.setIncludeQueryString(true);
  16. return loggingFilter;
  17. }

而且必须开启对CommonsRequestLoggingFilter的debug日志:

  1. logging:
  2. level:
  3. org.springframework.web.filter.CommonsRequestLoggingFilter: debug

自定义DispatcherServlet 实现请求日志记录

https://segmentfault.com/a/1190000018535456

Spring 使用了 DispatcherServlet 来拦截并分发请求,我们只要自己实现一个 DispatcherServlet 并在其中对请求和响应做处理打印到日志中即可。
我们实现一个自己的分发 Servlet ,它继承于 DispatcherServlet,我们实现自己的 doDispatch(HttpServletRequest request, HttpServletResponse response) 方法。