快驴生鲜系统用户操作日志方案:从需求到实施全解析
分类:IT频道
时间:2025-12-05 12:00
浏览:3
概述
一、需求分析 1.日志记录范围: -用户登录/登出操作 -关键业务操作(下单、修改订单、取消订单等) -系统配置变更 -敏感数据访问 2.日志内容要求: -操作时间 -用户ID/用户名 -操作类型 -操作对象(如订单ID、商品ID等) -操作结果(成功/失败)
内容
一、需求分析
1. 日志记录范围:
- 用户登录/登出操作
- 关键业务操作(下单、修改订单、取消订单等)
- 系统配置变更
- 敏感数据访问
2. 日志内容要求:
- 操作时间
- 用户ID/用户名
- 操作类型
- 操作对象(如订单ID、商品ID等)
- 操作结果(成功/失败)
- 操作IP地址
- 操作详情(可选)
3. 日志存储要求:
- 持久化存储
- 支持按时间范围查询
- 支持按用户/操作类型筛选
- 保留周期(如90天)
二、技术方案设计
1. 日志记录方式选择
方案对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|------|------|------|----------|
| AOP切面记录 | 代码侵入性低,统一管理 | 对复杂业务逻辑支持有限 | 适合简单CRUD操作 |
| 手动代码记录 | 灵活,可记录详细上下文 | 代码重复,维护成本高 | 复杂业务逻辑 |
| 事件驱动模式 | 解耦,易于扩展 | 实现复杂度较高 | 大型分布式系统 |
最终选择:采用AOP+手动记录结合的方式
- 通用操作使用AOP记录
- 复杂业务逻辑手动记录关键信息
2. 技术栈选择
- 日志框架:Log4j2 + MDC(Mapped Diagnostic Context)
- 存储方案:
- 近期日志:Elasticsearch(便于快速查询)
- 历史归档:HDFS/S3(冷存储)
- 日志收集:Filebeat + Logstash
- 查询界面:Kibana + 自定义管理后台
三、具体实现
1. 日志实体设计
```java
@Data
public class OperationLog {
private String logId; // 日志ID
private String userId; // 用户ID
private String username; // 用户名
private String operationType; // 操作类型
private String operationObj; // 操作对象
private String operationResult;// 操作结果
private String clientIp; // 客户端IP
private String requestParams; // 请求参数(脱敏)
private String detail; // 操作详情
private LocalDateTime operateTime; // 操作时间
private String systemModule; // 系统模块
}
```
2. AOP切面实现
```java
@Aspect
@Component
public class OperationLogAspect {
@Autowired
private OperationLogService logService;
// 定义切点:标注了@OperationLog注解的方法
@Pointcut("@annotation(com.kuaile.annotation.OperationLog)")
public void logPointCut() {}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 获取注解信息
OperationLog operationLog = method.getAnnotation(OperationLog.class);
// 记录开始时间
long startTime = System.currentTimeMillis();
// 执行方法
Object result;
try {
result = joinPoint.proceed();
// 记录成功日志
saveLog(joinPoint, operationLog, "SUCCESS", result);
} catch (Exception e) {
// 记录失败日志
saveLog(joinPoint, operationLog, "FAIL", e.getMessage());
throw e;
}
return result;
}
private void saveLog(ProceedingJoinPoint joinPoint, OperationLog annotation,
String result, Object returnValue) {
// 实现日志保存逻辑
// 获取用户信息、参数、IP等
// ...
}
}
```
3. 关键业务手动记录
对于复杂业务逻辑,采用手动记录方式:
```java
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OperationLogService logService;
@Override
public Order createOrder(OrderCreateDTO dto, String userId) {
// 业务逻辑...
// 手动记录日志
OperationLog log = new OperationLog();
log.setUserId(userId);
log.setOperationType("CREATE_ORDER");
log.setOperationObj(orderId);
log.setDetail("创建订单: " + JSON.toJSONString(dto));
logService.save(log);
return order;
}
}
```
4. 日志脱敏处理
```java
public class LogDesensitization {
public static String desensitize(String original) {
if (original == null) return null;
// 手机号脱敏
if (original.matches("^1[3-9]\\d{9}$")) {
return original.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1$2");
}
// 身份证脱敏
if (original.matches("^\\d{17}[\\dXx]$")) {
return original.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1$2");
}
// 默认返回原字符串
return original;
}
}
```
四、日志存储与查询
1. Elasticsearch索引设计
```json
{
"mappings": {
"properties": {
"operateTime": { "type": "date" },
"userId": { "type": "keyword" },
"username": { "type": "text", "fields": { "keyword": { "type": "keyword" } } },
"operationType": { "type": "keyword" },
"operationObj": { "type": "keyword" },
"operationResult": { "type": "keyword" },
"clientIp": { "type": "ip" },
"detail": { "type": "text", "index": false } // 详细信息不建索引
}
}
}
```
2. 日志查询API示例
```java
@RestController
@RequestMapping("/api/logs")
public class LogController {
@Autowired
private OperationLogService logService;
@GetMapping
public PageResult queryLogs(
@RequestParam(required = false) String userId,
@RequestParam(required = false) String operationType,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startTime,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return logService.queryLogs(userId, operationType, startTime, endTime, page, size);
}
}
```
五、部署与监控
1. 日志收集流程:
```
应用日志 → Filebeat → Logstash → Elasticsearch → Kibana
```
2. 监控指标:
- 日志生成速率
- 错误操作比例
- 敏感操作频率
- 日志存储空间使用率
3. 告警规则:
- 连续5分钟错误操作率>10%
- 单日敏感操作次数超过阈值
- 日志存储空间剩余<10%
六、测试用例
1. 正常流程测试:
- 用户登录后执行下单操作
- 验证日志是否完整记录
- 验证敏感信息是否脱敏
2. 异常流程测试:
- 模拟系统异常时的日志记录
- 验证日志是否包含错误堆栈
3. 性能测试:
- 高并发场景下的日志写入性能
- 日志查询响应时间
七、优化方向
1. 异步日志写入:采用消息队列缓冲日志,避免影响主业务流程
2. 日志分级存储:热数据存ES,冷数据归档至对象存储
3. 智能日志分析:通过NLP分析操作日志,发现潜在风险
4. 操作溯源:基于日志实现操作全链路追踪
八、实施计划
1. 第一阶段(2周):完成基础日志框架搭建和核心功能开发
2. 第二阶段(1周):实现日志脱敏和存储优化
3. 第三阶段(1周):开发管理界面和监控告警
4. 第四阶段(持续):根据业务反馈迭代优化
以上是快驴生鲜系统用户操作日志的开发记录概要,实际实施时需根据具体业务场景和技术栈进行调整。
评论