Spring Boot AOP 实现请求日志记录
创作时间:
作者:
@小白创作中心
Spring Boot AOP 实现请求日志记录
引用
CSDN
1.
https://m.blog.csdn.net/weixin_62490394/article/details/145629644
在 Web 开发中,记录请求日志是非常重要的,它不仅可以帮助我们排查问题,还能分析用户行为,优化系统性能。本篇文章将介绍如何使用Spring Boot和AOP(面向切面编程)实现自动记录请求日志,并将日志存入数据库。
1. 数据库设计
首先,我们需要设计一个数据库表来存储请求日志,表结构如下:
数据库表设计示例如下:
CREATE TABLE request_log (
request_id BIGINT PRIMARY KEY,
request_time DATETIME,
source_ip VARCHAR(45),
source_system VARCHAR(100),
request_method VARCHAR(50),
request_url VARCHAR(100),
request_params VARCHAR(255),
create_time DATETIME
);
2. 自定义日志注解
使用Spring AOP记录请求日志时,我们可以定义一个自定义注解 @LogRequest
,用于标记需要记录日志的方法。
创建 LogRequest.java
:
/**
* 日志记录注解
*
* @author
* @since: 2025/2/14
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogRequest {
String value() default "";
}
这个注解可以加在Controller 层的方法上,表示该方法的请求日志需要被记录。
3. 日志记录拦截器(AOP 切面)
接下来,我们使用AOP实现日志记录切面 LogRequestAspect.java
:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* 请求日志记录切面
*
* @author
* @since: 2025/2/14
*/
@Aspect
@Component
public class LogRequestAspect {
private static final Logger log = LoggerFactory.getLogger(LogRequestAspect.class);
@Autowired
private RequestLogService requestLogService;
@Around("@annotation(logRequest)")
public Object logRequest(ProceedingJoinPoint joinPoint, LogRequest logRequest) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) {
log.error("无法获取 HttpServletRequest,当前线程可能不在 HTTP 请求上下文中");
return joinPoint.proceed();
}
HttpServletRequest request = attributes.getRequest();
LocalDateTime now = LocalDateTime.now();
// 获取方法参数
Object[] args = joinPoint.getArgs();
String params = Arrays.stream(args)
.map(Object::toString)
.collect(Collectors.joining(", "));
// 构造日志对象
RequestLog requestLog = new RequestLog();
requestLog.setRequestId(IdWorker.getId()); // 生成唯一 ID
requestLog.setRequestTime(now);
requestLog.setSourceIp(request.getRemoteAddr());
requestLog.setSourceSystem(request.getHeader("User-Agent"));
requestLog.setRequestMethod(request.getMethod());
requestLog.setRequestUrl(request.getRequestURI());
requestLog.setRequestParams(params);
requestLog.setCreateTime(now);
// 保存日志
requestLogService.save(requestLog);
return joinPoint.proceed();
}
}
4. 日志实体类
创建 RequestLog.java
,用于存储日志信息:
import java.time.LocalDateTime;
import lombok.Data;
@Data
public class RequestLog {
private Long requestId;
private LocalDateTime requestTime;
private String sourceIp;
private String sourceSystem;
private String requestMethod;
private String requestUrl;
private String requestParams;
private LocalDateTime createTime;
}
5. 日志服务类
创建 RequestLogService.java
,用于存储日志:
import org.springframework.stereotype.Service;
@Service
public class RequestLogService {
public void save(RequestLog requestLog) {
// 这里可以将日志存入数据库
System.out.println("日志记录:" + requestLog);
}
}
在实际项目中,你可以将 requestLog
存入数据库,比如使用MyBatis-Plus或JPA进行持久化。
6. 使用日志注解
在 Controller 方法上加上 @LogRequest
注解,就能自动记录请求日志。例如:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class TestController {
@LogRequest
@GetMapping("/test")
public String test(@RequestParam String name) {
return "Hello, " + name;
}
}
当访问 http://localhost:8080/api/test?name=ShenChen
时,日志会被自动记录。
7. 运行效果
运行 Spring Boot 应用后,控制台会打印日志信息,例如:
日志记录:RequestLog(
requestId=123456789,
requestTime=2025-02-14T14:30:00,
sourceIp=192.168.1.100,
sourceSystem=Mozilla/5.0 (Windows NT 10.0),
requestMethod=GET,
requestUrl=/api/test,
requestParams=name=ShenChen,
createTime=2025-02-14T14:30:00
)
如果配置了数据库存储,日志也会被保存到数据库中。
8. 总结
本篇文章介绍了如何使用Spring Boot AOP记录请求日志,包括:
- 设计数据库表
- 自定义
@LogRequest
注解 - 使用 AOP 记录日志
- 创建
RequestLog
实体类 - 编写日志存储服务
- 在 Controller 中使用注解
这种方式不仅能自动记录日志,还能减少代码侵入性,使日志管理更加灵活高效。
热门推荐
泛舟河上悟人生:梭罗《河上一周》的自然与哲思
顺治帝福临登基背后的权力博弈
科学补光让母鸡多产蛋,养殖户年省千元电费
18道营养均衡家常菜,省钱也能吃出健康
从亚里士多德到量子引力:人类认识引力的八个阶段
寻找最新的和失落的佛教考古遗址|巴基斯坦西北边境山地考察(I)
从额温枪到呼吸机:传感器技术如何改变医疗服务
月季花籽怎样种才能出
探访诗歌里的最美大学校园
Isabella教你搞定B字组合发音
青铜器上的中国:鼎与尊的礼制文化
中国武器出口金额惊人:每年狂揽1000亿,全球排名第二!
山东德州有菲律宾老国王墓:苏禄国东王巴都葛叭哈刺的传奇
灯光氛围在景观设计中的应用
美元信用下滑叠加降息预期,黄金迎来长期配置机遇
美的变频空调E51等故障代码详解:自己就能解决的小问题
乌鲁木齐绕城高速公路(西线)通车试运行
商丘自驾攻略:六大景点串起3000年历史
燃气灶点火针维护小窍门,让你秒变厨房达人
ImageNet竞赛:CNN图像识别的新高度
香港警匪片四十年,如何被“中港合拍”所改变?
502胶水怎么去除
四步科学护理狗狗肉垫,宠物美容师的专业建议
三位一体vs四谛:解密基督教与佛教的核心教义
北京三大皇家建筑:天坛、故宫、颐和园
隔水炖燕窝:营养价值最大化,5步轻松上手
左氧氟沙星抗菌谱广效果强,但这些人群禁用需谨慎
基于4700个景点大数据:2023年下半年日本旅游必去10地
中医是如何调理肝癌的?能预防复发吗
2024全球人均GDP排名出炉:美国排名第九!