1.需求说明
公司要求采集项目api接口信息(请求地址、请求参数、响应时间等),便于后期业务优化
2.实现方案
采用filter拦截器实现采集日志,后来发现有两个问题需要解决,1、filter读取IO流信息后,不能再被Controller获得导致接口错误;2、文件等资源上传报错
解决思路:1、继承HttpServletRequestWrapper回写请求参数数据;2、文件上传不做拦截处理
当前市面上搜索到的解决方案配置的拦截器代码如下:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.util.StopWatch; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.UUID; @Order(Ordered.HIGHEST_PRECEDENCE) @WebFilter(filterName = "traceLogFilter", urlPatterns = "/*") public class TraceLogFilter implements Filter { private static final Logger LOGGER = L