在 Spring 框架中简要记录接口请求日志

1 阅读1分钟

我们通过 Servlet 的中间件 Filter 来实现,记录接口请求日志。

实现过程

  1. 首先定义一个 Spring 组件,这里类名叫 WebRequestLogFilter,继承框架自带的 AbstractRequestLoggingFilter 类,本质上是一个中间件 Filter 类。
  2. 通过注解 @Order 指定中间件优先级。
  3. 在方法 doFilterInternal 中,配置日志记录选项。
  4. 在方法 beforeRequest 中,记录请求处理前的日志。
  5. 在方法 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);
    }
}

完成源码地址,见我的仓库 spring-example/example51/src/main/java/example/web/filter/WebRequestLogFilter.java at main · xingchaovv/spring-example (github.com)