
在Spring Boot应用程序中,对接口请求日志的记录有着极为重要的作用和优势。其主要用途包括:故障排查与调试、性能优化、安全监控、审计和合规以及业务分析和监控系统健康。
对于如何记录请求日志的技术实现方式,我们有很多种选择,例如使用切面AOP、过滤器等技术。在这里,我们将介绍一种通过SpringMVC的来实现的方式。
一、创建类
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestLoggingInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(RequestLoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 请求开始时记录日志
logger.info(“请求开始 – URL: {}, 方法: {}”, request.getRequestURI(), request.getMethod());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理完成但未渲染视图时记录日志
logger.info(“请求处理完成(视图渲染前) – URL: {}, 方法: {}”, request.getRequestURI(), request.getMethod());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if (ex != null) {
// 如果有异常,记录异常日志
logger.error(“请求过程中发生异常 – URL: {}, 方法: {}”, request.getRequestURI(), request.getMethod(), ex);
} else {
// 请求正常完成,记录完成日志
logger.info(“请求完成 – URL: {}, 方法: {}”, request.getRequestURI(), request.getMethod());
}
}
二、注册
接下来,我们需要创建一个配置类,继承自WebMvcConfigurer接口,并实现其中的addInterceptors方法,将我们的注册到Spring MVC中。
java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册
registry.addInterceptor(new RequestLoggingInterceptor())
// 拦截所有的请求路径
.addPathPatterns(“/”);
}
