一、需求分析
1. 日志记录范围:
- 用户登录/登出操作
- 商品浏览、搜索、筛选行为
- 购物车操作(添加、修改、删除商品)
- 订单创建、支付、取消流程
- 售后申请与处理
- 用户信息修改
- 敏感操作(如删除、批量操作等)
2. 日志内容要求:
- 操作时间戳
- 用户ID及角色
- 操作类型
- 操作对象(如商品ID、订单号等)
- 操作前后的数据变化(可选)
- 操作结果(成功/失败及原因)
- 客户端信息(IP、设备类型等)
二、技术方案设计
1. 日志存储方案
方案一:数据库存储
- 优点:便于查询和统计分析
- 缺点:高并发时可能影响性能
- 实现:
```sql
CREATE TABLE user_operation_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
username VARCHAR(50),
operation_type VARCHAR(50) NOT NULL,
operation_object VARCHAR(100),
operation_content TEXT,
operation_result VARCHAR(20),
client_ip VARCHAR(50),
user_agent VARCHAR(255),
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
```
方案二:ELK日志系统
- 优点:适合大规模日志处理和分析
- 缺点:实现复杂度较高
- 实现:通过Logstash收集日志,Elasticsearch存储,Kibana展示
最终选择:采用数据库存储为主,重要日志同步到ELK
2. 日志记录实现方式
AOP切面实现(推荐)
```java
@Aspect
@Component
public class OperationLogAspect {
@Autowired
private UserOperationLogMapper logMapper;
@AfterReturning(pointcut = "@annotation(com.kuaile.annotation.OperationLog)",
returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
// 获取方法注解信息
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
OperationLog operationLog = method.getAnnotation(OperationLog.class);
// 构建日志对象
UserOperationLog log = new UserOperationLog();
// 设置日志属性...
// 保存日志
logMapper.insert(log);
}
}
```
自定义注解
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String operationType() default "";
String operationObject() default "";
boolean recordResult() default true;
}
```
3. 日志级别设计
1. INFO级别:常规操作记录
2. WARN级别:异常但非致命操作
3. ERROR级别:导致系统异常的操作
三、具体实现代码
1. 实体类定义
```java
public class UserOperationLog {
private Long id;
private Long userId;
private String username;
private String operationType;
private String operationObject;
private String operationContent;
private String operationResult;
private String clientIp;
private String userAgent;
private Date createTime;
// getters and setters...
}
```
2. Mapper接口
```java
public interface UserOperationLogMapper {
int insert(UserOperationLog log);
List selectByCondition(UserOperationLogQuery query);
int countByCondition(UserOperationLogQuery query);
}
```
3. 服务层实现
```java
@Service
public class OperationLogService {
@Autowired
private UserOperationLogMapper logMapper;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void recordLog(UserOperationLog log) {
// 异步记录日志,避免影响主流程
logMapper.insert(log);
}
public PageResult queryLogs(UserOperationLogQuery query) {
// 分页查询日志
int total = logMapper.countByCondition(query);
if (total > 0) {
List list = logMapper.selectByCondition(query);
return new PageResult<>(total, list);
}
return PageResult.empty();
}
}
```
4. 控制器示例
```java
@RestController
@RequestMapping("/api/orders")
public class OrderController {
@Autowired
private OrderService orderService;
@Autowired
private OperationLogService logService;
@OperationLog(operationType = "创建订单", operationObject = "订单")
@PostMapping
public Result createOrder(@RequestBody OrderCreateDTO dto,
@AuthenticationPrincipal UserDetails user) {
try {
Order order = orderService.createOrder(dto, user.getUsername());
// 记录成功日志
UserOperationLog log = new UserOperationLog();
log.setUserId(user.getId());
log.setUsername(user.getUsername());
log.setOperationType("创建订单");
log.setOperationObject(order.getOrderNo());
log.setOperationResult("成功");
log.setClientIp(getRequestIp());
logService.recordLog(log);
return Result.success(order);
} catch (Exception e) {
// 记录失败日志
UserOperationLog log = new UserOperationLog();
log.setUserId(user.getId());
log.setUsername(user.getUsername());
log.setOperationType("创建订单");
log.setOperationResult("失败: " + e.getMessage());
log.setClientIp(getRequestIp());
logService.recordLog(log);
return Result.fail("创建订单失败");
}
}
private String getRequestIp() {
// 获取客户端IP的逻辑
}
}
```
四、性能优化措施
1. 异步记录日志:使用@Async注解或消息队列异步处理
2. 批量插入:对于高并发场景,实现日志批量插入
3. 日志分级存储:
- 近期日志存数据库便于查询
- 历史日志归档到文件或对象存储
4. 采样记录:对高频操作进行采样记录而非全部记录
五、安全与合规考虑
1. 敏感信息脱敏:
- 用户密码、支付信息等不记录
- 手机号、身份证号等部分脱敏
2. 访问控制:
- 日志查询接口需要权限控制
- 操作日志本身不可被篡改
3. 数据保留策略:
- 根据业务需求制定日志保留期限
- 定期清理过期日志
六、监控与告警
1. 异常操作监控:
- 频繁失败的操作
- 敏感操作(如删除大量数据)
2. 告警规则:
- 同一用户短时间内大量失败操作
- 特定操作类型异常增多
3. 可视化展示:
- 操作类型分布
- 操作成功率趋势
- 活跃用户操作统计
七、测试要点
1. 功能测试:
- 验证各种操作是否正确记录日志
- 验证日志内容完整性
2. 性能测试:
- 高并发场景下日志记录对系统性能的影响
- 批量插入性能
3. 异常测试:
- 日志存储失败时的系统行为
- 网络异常时的日志重试机制
八、部署与运维
1. 日志轮转:配置日志文件轮转策略
2. 备份策略:定期备份重要操作日志
3. 灾备方案:确保日志数据可恢复
九、后续优化方向
1. 引入机器学习分析异常操作模式
2. 实现操作日志的实时分析预警
3. 增加操作回溯功能,支持从日志重建操作流程
以上是快驴生鲜系统用户操作日志开发的主要记录,实际实现时需要根据具体业务场景和技术栈进行调整。