可在拦截器preHandle中用SLF4J打印请求日志,记录URI、方法、IP及时间戳,需注册到WebMvcConfigurer,并可结合MDC实现链路追踪,注意生产环境日志级别与性能优化。

在 Spring Boot 项目中,可以在拦截器(HandlerInterceptor)的 preHandle 方法里打印每次请求进入的日志,这是最常用、最轻量的方式。
使用 SLF4J 在拦截器中打印请求日志
确保你的拦截器实现了 HandlerInterceptor 接口,并在 preHandle 中记录关键信息:
- 用
LoggerFactory.getLogger(YourInterceptor.class)获取日志对象 - 记录请求路径、HTTP 方法、客户端 IP、请求时间戳
- 避免直接打印敏感参数(如密码、token),可选择性脱敏或仅记录参数名
示例代码:
@Component
public class LoggingInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(LoggingInterceptor.class);
<pre class="brush:java;toolbar:false;">@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
String method = request.getMethod();
String remoteAddr = getClientIpAddress(request);
long startTime = System.currentTimeMillis();
// 将 startTime 存入 request attribute,供后续使用(如响应日志)
request.setAttribute("startTime", startTime);
log.info("REQ: {} {} | IP: {} | Time: {}", method, uri, remoteAddr, new Date());
return true;
}
private String getClientIpAddress(HttpServletRequest request) {
String xff = request.getHeader("X-Forwarded-For");
if (xff != null && !xff.isEmpty() && !"unknown".equalsIgnoreCase(xff)) {
return xff.split(",")[0].trim();
}
return request.getRemoteAddr();
}
}
注册拦截器到 WebMvcConfigurer
仅定义拦截器还不够,需显式注册才能生效:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 创建配置类实现
WebMvcConfigurer - 重写
addInterceptors方法,添加该拦截器 - 可通过
registry.addPathPatterns("/**")拦截所有请求,也可按需排除静态资源路径
示例注册:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor())
.excludePathPatterns("/static/**", "/actuator/**", "/favicon.ico");
}
}
进阶:结合 MDC 实现请求链路追踪
为区分并发请求日志,可借助 SLF4J 的 MDC(Mapped Diagnostic Context)添加唯一标识:
- 在
preHandle中生成 traceId(如用UUID.randomUUID().toString()),放入 MDC - 在
afterCompletion中清空 MDC,防止线程复用导致日志污染 - logback.xml 中配置 pattern,例如:
%d{HH:mm:ss.SSS} [%X{traceId}] [%t] %-5level %logger{36} - %msg%n
注意日志级别与性能影响
高频请求下,过度日志可能影响性能或刷屏:
- 生产环境建议用
INFO级别记录关键入口,调试时再开DEBUG - 避免在日志中拼接复杂对象(如
request.getParameterMap()全量打印),可选字段记录 - 考虑异步日志框架(如 Logback 配置 AsyncAppender)降低阻塞风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










