SpringBoot记录HTTP请求日志
https://juejin.cn/post/6844903666588057614
自定义HttpTraceFilter
在HttpTraceFilter继承了OncePerRequestFilter,我们可以仿照这个过滤器,定义自己的过滤器去继承OncePerRequestFilter,在doFilterInternal这个方法中获取到HttpServletRequest,HttpServletResponse,这样就可以获取到对应的请求参数和返回参数了。
@Slf4j
public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered {
private static final String NEED_TRACE_PATH_PREFIX = "/api";
private static final String IGNORE_CONTENT_TYPE = "multipart/form-data";
private final MeterRegistry registry;
public HttpTraceLogFilter(MeterRegistry registry) {
this.registry = registry;
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE - 10;
}
... ...
}
请求响应日志的常用手段
https://www.modb.pro/db/101981
CommonsRequestLoggingFilter
Spring Web模块还提供了一个过滤器CommonsRequestLoggingFilter,它可以对请求的细节进行日志输出。
配置起来也比较简单:
@Bean
CommonsRequestLoggingFilter loggingFilter(){
CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();
// 记录 客户端 IP信息
loggingFilter.setIncludeClientInfo(true);
// 记录请求头
loggingFilter.setIncludeHeaders(true);
// 如果记录请求头的话,可以指定哪些记录,哪些不记录
// loggingFilter.setHeaderPredicate();
// 记录 请求体 特别是POST请求的body参数
loggingFilter.setIncludePayload(true);
// 请求体的大小限制 默认50
loggingFilter.setMaxPayloadLength(10000);
//记录请求路径中的query参数
loggingFilter.setIncludeQueryString(true);
return loggingFilter;
}
而且必须开启对CommonsRequestLoggingFilter的debug日志:
logging:
level:
org.springframework.web.filter.CommonsRequestLoggingFilter: debug
自定义DispatcherServlet 实现请求日志记录
https://segmentfault.com/a/1190000018535456
Spring 使用了 DispatcherServlet 来拦截并分发请求,我们只要自己实现一个 DispatcherServlet 并在其中对请求和响应做处理打印到日志中即可。
我们实现一个自己的分发 Servlet ,它继承于 DispatcherServlet,我们实现自己的 doDispatch(HttpServletRequest request, HttpServletResponse response) 方法。