spring mvc 中推荐使用自定义拦截器统一记录请求日志,通过实现 handlerinterceptor 接口,在 prehandle 记录请求信息、aftercompletion 记录响应结果,并合理注册与性能优化。

在 Spring MVC 中,自定义拦截器是实现请求日志统一记录的常用且推荐方式。它能在请求进入 Controller 前、Controller 执行后、视图渲染完成后分别介入,适合记录 URL、参数、耗时、状态码等关键信息,避免在每个接口里重复写日志代码。
定义拦截器类继承 HandlerInterceptor
创建一个类实现 HandlerInterceptor 接口,或继承 HandlerInterceptorAdapter(Spring 5.3+ 已废弃,建议直接实现接口):
- 重写 preHandle:记录请求开始时间、URI、请求方法、IP、请求参数(注意过滤敏感字段如密码)
- 重写 afterCompletion:记录响应状态码、耗时、异常信息(如有)
- 不建议在 postHandle 中记录完整响应体(因此时 ModelAndView 可能未渲染,且响应体通常较大)
在 preHandle 中存储请求上下文
为计算耗时和传递数据,可在 preHandle 中将当前时间戳存入 request.setAttribute 或使用 ThreadLocal(需注意线程复用问题,推荐 request 属性):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- request.setAttribute("startTime", System.currentTimeMillis());
- 获取客户端 IP:用 request.getRemoteAddr(),若经 Nginx 转发,应读取 X-Forwarded-For 头
- 获取请求参数:用 request.getParameterMap(),对值做脱敏(如手机号中间四位替换为 *)
注册拦截器到 WebMvcConfigurer
新建配置类实现 WebMvcConfigurer,重写 addInterceptors 方法:
- 调用 registry.addInterceptor(new LogInterceptor())
- 用 excludePathPatterns("/actuator/**", "/static/**", "/favicon.ico") 排除健康检查、静态资源路径,减少日志噪音
- 用 includePathPatterns("/**") 或按需指定业务路径(如 "/api/**")
控制日志输出粒度与性能
生产环境需平衡可观测性与性能开销:
- 对 GET 请求可只记 URI 和查询参数;POST/PUT 建议只记参数名,不记值(除非调试需要)
- 设置阈值,仅记录耗时 > 500ms 的慢请求(在 afterCompletion 中判断)
- 使用异步日志框架(如 Logback 的 AsyncAppender)避免阻塞主线程
- 避免在拦截器中调用远程服务或复杂计算
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










