使用 Spring Boot 实现 Filter 接口请求日志

记录接口请求日志是后端开发中非常重要的一部分,能够帮助我们了解系统中的请求情况以及进行问题排查。本文将带领刚入行的小白逐步实现 Spring Boot 的接口请求日志功能。

整体流程

我们将通过以下步骤来实现接口请求日志的记录功能:

步骤 描述
1 创建一个 Spring Boot 项目
2 定义 Filter 的实现类
3 注册 Filter
4 编写日志记录代码
5 测试接口请求

步骤详解

1. 创建一个 Spring Boot 项目

使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择 Web 依赖,生成项目后导入到 IDE 中。

2. 定义 Filter 的实现类

在项目中创建一个新的 Filter 类,例如 RequestLoggingFilter

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*") // 捕获所有请求
public class RequestLoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化配置,如果需要的话
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        long startTime = System.currentTimeMillis(); // 开始时间
        chain.doFilter(request, response); // 继续请求
        long endTime = System.currentTimeMillis(); // 结束时间
        
        // 计算执行时间并打印日志
        System.out.println("Request processed in: " + (endTime - startTime) + "ms");
    }

    @Override
    public void destroy() {
        // 清理工作,如果需要的话
    }
}
  • @WebFilter("/*"):注解定义了此 Filter 将拦截所有 URL 请求。
  • doFilter 方法中,我们记录了请求开始和结束的时间,并在控制台打印出请求处理时长。

3. 注册 Filter

在 Spring Boot 中,Filter 可以通过注解自动注册,然而更复杂的 Filter 可能需要更多注册步骤,通常我们可以在主类中进行注册。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. 编写日志记录代码

如之前 Filter 实现中的 doFilter 方法一样,我们已经通过 System.out.println 打印了请求日志。在实际项目中,我们可以使用日志框架(如 SLF4J)来更规范地记录日志。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// 在类中定义 logger
private static final Logger logger = LoggerFactory.getLogger(RequestLoggingFilter.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    long startTime = System.currentTimeMillis();
    chain.doFilter(request, response);
    long endTime = System.currentTimeMillis();

    // 使用 logger 打印日志
    logger.info("Request processed in: " + (endTime - startTime) + "ms");
}

5. 测试接口请求

启动 Spring Boot 应用,并通过 Postman 或其他工具发送接口请求,查看控制台或日志文件,确认日志记录是否准确。

stateDiagram
    [*] --> 创建项目: 开始创建 Spring Boot 项目
    创建项目 --> 定义 Filter: 定义 RequestLoggingFilter 类
    定义 Filter --> 注册 Filter: 注册 Filter 到 Spring
    注册 Filter --> 编写日志: 编写日志记录代码
    编写日志 --> 测试接口: 通过工具测试接口请求
    测试接口 --> [*]: 结束

结尾

通过以上步骤,我们成功实现了一个简单的请求日志 Filter。该 Filter 在每次请求被处理时都会记录处理时长,方便我们监控系统性能。希望你在实际开发中能进一步优化和扩展这个功能,比如记录请求路径、参数等信息。如果有其他问题,欢迎再次提问!