一、需求分析
1. 日志记录目的:
- 追踪用户操作行为,便于问题排查
- 满足合规性要求(如食品安全追溯)
- 分析用户行为模式,优化系统设计
2. 需记录的操作类型:
- 用户登录/登出
- 商品浏览、搜索
- 购物车操作(添加/删除/修改数量)
- 订单创建、支付、取消
- 售后申请与处理
- 个人信息修改
- 敏感操作(如删除数据、权限变更)
二、系统设计
1. 日志数据结构
```json
{
"log_id": "唯一标识符",
"user_id": "用户ID",
"username": "用户名",
"operation_type": "操作类型",
"operation_content": "操作详情",
"request_params": "请求参数(脱敏)",
"response_data": "响应数据(脱敏)",
"ip_address": "IP地址",
"user_agent": "客户端信息",
"operation_time": "操作时间戳",
"device_info": "设备信息",
"result": "操作结果(成功/失败)",
"module": "所属模块(如订单、商品等)"
}
```
2. 技术选型
- 存储方案:Elasticsearch(快速检索) + HBase(长期存储)
- 采集方式:AOP切面编程 + 手动关键点记录
- 传输方式:Kafka消息队列异步处理
- 分析工具:Kibana可视化 + 自定义报表
三、开发实现
1. 后端实现(Spring Boot示例)
```java
// 日志注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String operationType();
String module() default "";
boolean saveResponse() default false;
}
// 日志切面
@Aspect
@Component
public class OperationLogAspect {
@Autowired
private LogService logService;
@Around("@annotation(operationLog)")
public Object around(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable {
// 获取方法参数
Object[] args = joinPoint.getArgs();
// 获取用户信息(从ThreadLocal或Token)
UserInfo userInfo = UserContext.getCurrentUser();
// 执行方法
Object result = joinPoint.proceed();
// 构建日志对象
OperationLogEntity log = new OperationLogEntity();
log.setUserId(userInfo.getUserId());
log.setUsername(userInfo.getUsername());
log.setOperationType(operationLog.operationType());
log.setModule(operationLog.module());
log.setOperationTime(new Date());
log.setIpAddress(RequestContext.getIp());
// ...其他字段设置
// 保存日志(异步)
logService.saveLogAsync(log);
return result;
}
}
```
2. 前端实现(可选)
```javascript
// 在关键操作处发送日志
function logUserOperation(type, details) {
const logData = {
type,
details,
timestamp: new Date().toISOString(),
// 其他上下文信息
};
// 通过API发送或直接在页面埋点
if (window.analyticsEnabled) {
fetch(/api/log, {
method: POST,
body: JSON.stringify(logData)
});
}
}
// 示例:订单提交时记录
submitOrderButton.onclick = function() {
logUserOperation(order_submit, {
items: cartItems,
total: orderTotal
});
// ...实际提交逻辑
};
```
3. 日志服务实现
```java
@Service
public class LogServiceImpl implements LogService {
@Autowired
private KafkaTemplate kafkaTemplate;
@Async
@Override
public void saveLogAsync(OperationLogEntity log) {
// 参数脱敏处理
String sanitizedLog = sanitizeLogData(log);
// 发送到Kafka
kafkaTemplate.send("user-operation-logs", sanitizedLog);
// 或者直接写入ES
// elasticsearchTemplate.save(log);
}
private String sanitizeLogData(OperationLogEntity log) {
// 实现数据脱敏逻辑
// 如隐藏手机号中间四位、信用卡号等敏感信息
return JSON.toJSONString(log);
}
}
```
四、高级功能实现
1. 日志关联分析
```java
// 查询用户操作序列
public List getUserOperationSequence(String userId, Date startTime, Date endTime) {
// 从ES按时间顺序查询
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("user_id", userId))
.must(QueryBuilders.dateRangeQuery("operation_time")
.gte(startTime.getTime())
.lte(endTime.getTime())))
.withSort(SortBuilders.fieldSort("operation_time").order(SortOrder.ASC))
.build();
SearchHits hits = elasticsearchOperations.search(searchQuery, OperationLogEntity.class);
return hits.stream().map(SearchHit::getContent).collect(Collectors.toList());
}
```
2. 异常操作预警
```java
// 检测异常操作模式
public void detectAbnormalBehavior(String userId) {
// 1. 获取用户最近操作
List recentLogs = getRecentLogs(userId, 30, TimeUnit.MINUTES);
// 2. 分析操作频率
Map operationCounts = recentLogs.stream()
.collect(Collectors.groupingBy(
OperationLogEntity::getOperationType,
Collectors.counting()
));
// 3. 检测异常(如短时间内大量取消订单)
if (operationCounts.getOrDefault("order_cancel", 0L) > 5) {
// 触发预警
alertService.triggerAlert(userId, "频繁取消订单");
}
// 4. 其他检测逻辑...
}
```
五、部署与优化
1. 日志存储策略:
- 最近7天数据存ES,供实时查询
- 历史数据转存至HBase或冷存储
2. 性能优化:
- 批量写入代替单条写入
- 异步处理非关键日志
- 压缩日志数据
3. 安全措施:
- 日志访问权限控制
- 敏感数据加密存储
- 定期审计日志访问记录
六、测试用例示例
1. 正常流程测试:
- 用户登录后执行商品浏览、加购、下单流程
- 验证日志是否完整记录各步骤
2. 异常流程测试:
- 模拟支付失败场景
- 验证错误日志是否准确记录失败原因
3. 性能测试:
- 高并发场景下日志写入性能
- 日志查询响应时间
4. 安全测试:
- 验证敏感信息是否脱敏
- 测试非授权用户能否访问日志
七、运维监控
1. 监控指标:
- 日志写入延迟
- 存储空间使用率
- 日志查询成功率
2. 告警规则:
- 连续5分钟日志写入失败
- 存储空间使用率>80%
- 异常操作模式检测
3. 日志轮转:
- 按时间或大小自动分割日志文件
- 定期清理过期日志
八、后续优化方向
1. 引入机器学习模型进行异常行为检测
2. 实现日志数据的实时分析看板
3. 增加操作日志的上下文关联(如订单状态变更链)
4. 优化日志查询性能,支持复杂条件组合查询
通过以上实现,快驴生鲜系统可以建立起完善的用户操作日志体系,既满足业务运营需求,又为系统安全审计提供有力支持。