我们通过 Servlet 的中间件 Filter 来实现,记录接口请求日志。
实现过程
- 首先定义一个 Spring 组件,这里类名叫 WebRequestLogFilter,继承框架自带的 AbstractRequestLoggingFilter 类,本质上是一个中间件 Filter 类。
- 通过注解 @Order 指定中间件优先级。
- 在方法 doFilterInternal 中,配置日志记录选项。
- 在方法 beforeRequest 中,记录请求处理前的日志。
- 在方法 afterRequest 中,记录请求处理后的日志。
源码如下
package example.web.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.AbstractRequestLoggingFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 接口请求日志记录
*/
@Component
@Slf4j
@Order(1)
public class WebRequestLogFilter extends AbstractRequestLoggingFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
setIncludeQueryString(true);
setIncludeClientInfo(true);
setIncludePayload(true);
setIncludeHeaders(false);
setMaxPayloadLength(1024 * 1024);
super.doFilterInternal(request, response, filterChain);
}
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
String requestURI = request.getRequestURI();
log.info("准备处理请求,请求路径:{},请求详情: {}", requestURI, message);
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
String requestURI = request.getRequestURI();
log.info("完成处理请求,请求路径:{},请求详情: {}", requestURI, message);
}
}