Spring Boot 接口日志统一打印方案
项目开发阶段,我们可通过调试工具实时查看接口请求与响应信息,但项目上线后,调试工具无法直接使用,日志就成为排查接口问题、定位异常原因的核心依据。如果日志打印不规范——比如请求参数缺失、响应结果不完整、无接口耗时统计,会导致排查问题时效率低下,甚至无法定位问题根源。本文将针对这一痛点,提供一套Spring Boot接口日志统一打印方案,通过AOP拦截请求、规范日志级别、配置日志按天分割,实现接口日志的标准化、可追溯,大幅提升线上问题排查效率。
本方案无需侵入业务代码,通过AOP切面统一拦截所有接口请求,自动打印请求URL、请求方法、请求参数、响应结果、接口耗时等关键信息;同时配置合理的日志级别,避免无效日志冗余;再通过日志按天分割,解决单个日志文件过大、难以查阅的问题,完全适配线上项目的日志管理需求。
一、核心依赖准备(极简配置,无需额外引入过多依赖)
Spring Boot默认集成了Spring AOP和SLF4J+Logback日志框架,无需手动引入AOP和日志核心依赖,仅需确保项目中存在Spring Web依赖(接口开发基础),若项目为纯后端接口项目,已有的依赖即可满足需求。
若项目中缺失相关依赖(如低版本Spring Boot),可手动引入以下依赖,确保AOP和日志功能正常生效:
<!-- Spring AOP 依赖(低版本Spring Boot需手动引入) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 日志框架依赖(Spring Boot默认集成,无需重复引入,此处仅作参考) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
注意:Spring Boot 2.x及以上版本均默认集成上述依赖,无需手动添加;若引入后出现依赖冲突,可排除项目中重复的AOP或日志相关依赖,确保依赖版本与Spring Boot版本匹配。
二、AOP 拦截请求:统一打印核心日志信息
核心思路:通过AOP切面,拦截所有Controller层的接口请求,在请求进入接口前打印请求相关信息(URL、请求方法、请求参数),在接口执行完成后打印响应结果和接口耗时,实现日志的统一打印,无需在每个接口中手动编写日志打印代码,避免代码冗余。
此处采用@Around环绕通知,既能在请求前执行,也能在请求后执行,便于统计接口耗时;同时通过切入点表达式,精准拦截Controller层的所有接口,避免拦截非接口方法(如Service层、工具类方法)。
2.1 编写AOP切面类(核心代码,无导包可直接复制)
// AOP接口日志切面类:统一拦截接口请求,打印日志
@Aspect
@Component
@Slf4j // Lombok注解,简化日志打印(无需手动创建Logger对象)
public class InterfaceLogAspect {
// 切入点表达式:拦截所有Controller层的接口(com.example.controller为你的Controller包路径)
@Pointcut("execution(* com.example.controller..*.*(..))")
public void interfaceLogPointcut() {
}
// 环绕通知:在接口执行前后打印日志,统计接口耗时
@Around("interfaceLogPointcut()")
public Object aroundInterface(ProceedingJoinPoint joinPoint) throws Throwable {
// 1. 请求前:打印请求相关信息
long startTime = System.currentTimeMillis(); // 记录请求开始时间
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 打印请求URL、请求方法、请求IP、类方法
log.info("===================================== 接口请求开始 =====================================");
log.info("请求URL:{}", request.getRequestURI());
log.info("请求方法:{}"

2674

被折叠的 条评论
为什么被折叠?



