一、需求分析 1.日志记录目标: -记录用户在系统中的关键操作行为 -便于问题追踪、安全审计和业务分析 -满足合规性要求(如食品安全追溯) 2.需记录的操作类型: -用户登录/登出 -商品管理(增删改查) -订单处理(创建、修改、取消) -库存调整 -权限变更
一、需求分析
1. 日志记录目标:
- 记录用户在系统中的关键操作行为
- 便于问题追踪、安全审计和业务分析
- 满足合规性要求(如食品安全追溯)
2. 需记录的操作类型:
- 用户登录/登出
- 商品管理(增删改查)
- 订单处理(创建、修改、取消)
- 库存调整
- 权限变更
- 敏感数据访问
二、系统设计
1. 日志数据结构
```json
{
"log_id": "唯一标识符",
"user_id": "操作用户ID",
"username": "用户名",
"operation_type": "操作类型(CREATE/READ/UPDATE/DELETE/LOGIN等)",
"module": "所属模块(商品/订单/库存等)",
"operation_detail": "操作详情(JSON格式)",
"ip_address": "操作IP",
"user_agent": "客户端信息",
"operation_time": "操作时间(ISO8601)",
"result": "操作结果(SUCCESS/FAILED)",
"related_id": "关联业务ID(如订单号、商品ID等)",
"before_data": "操作前数据(可选)",
"after_data": "操作后数据(可选)"
}
```
2. 技术架构
- 日志收集:AOP切面编程+注解方式记录
- 存储方案:
- 实时日志:Elasticsearch(快速检索)
- 长期归档:HDFS/S3(冷存储)
- 传输方式:Kafka消息队列异步处理
- 查询界面:基于Kibana的日志查询面板
三、开发实现
1. 后端实现(Spring Boot示例)
自定义日志注解
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String operationType();
String module();
String detail() default "";
boolean saveBeforeData() default false;
boolean saveAfterData() default false;
}
```
日志切面实现
```java
@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或SecurityContext)
UserInfo user = getCurrentUser();
// 执行方法前记录
OperationLogDTO beforeLog = buildBeforeLog(user, operationLog, args);
// 执行原方法
Object result = joinPoint.proceed();
// 执行方法后记录
OperationLogDTO afterLog = buildAfterLog(user, operationLog, args, result);
// 异步保存日志
logService.saveLogAsync(afterLog);
return result;
}
// 构建日志对象方法...
}
```
2. 日志服务实现
```java
@Service
public class LogServiceImpl implements LogService {
@Autowired
private KafkaTemplate
kafkaTemplate;
@Override
public void saveLogAsync(OperationLogDTO log) {
// 转换为JSON
String logJson = JSON.toJSONString(log);
// 发送到Kafka
kafkaTemplate.send("operation-logs", logJson);
}
// Kafka消费者处理日志存储...
}
```
3. 前端埋点(可选)
对于部分需要前端记录的操作(如页面访问时长):
```javascript
// 使用axios拦截器记录API调用
axios.interceptors.request.use(config => {
if (shouldLog(config)) {
trackApiCall({
url: config.url,
method: config.method,
timestamp: new Date().toISOString()
});
}
return config;
});
```
四、存储方案
1. Elasticsearch索引设计
```json
PUT /operation_logs
{
"mappings": {
"properties": {
"log_id": { "type": "keyword" },
"user_id": { "type": "keyword" },
"username": { "type": "text" },
"operation_type": { "type": "keyword" },
"module": { "type": "keyword" },
"operation_detail": { "type": "text" },
"ip_address": { "type": "ip" },
"user_agent": { "type": "text" },
"operation_time": { "type": "date" },
"result": { "type": "keyword" },
"related_id": { "type": "keyword" },
"before_data": { "type": "object", "enabled": false },
"after_data": { "type": "object", "enabled": false }
}
}
}
```
2. 数据归档策略
- 实时数据:Elasticsearch(保留最近3个月)
- 历史数据:HDFS/S3(按年分区)
- 定期任务:将旧数据从ES迁移到冷存储
五、查询界面实现
1. 基本查询功能:
- 按用户、时间范围、操作类型筛选
- 支持模糊搜索操作详情
2. 高级功能:
- 操作序列分析(追踪特定业务流程)
- 异常操作检测(频繁失败操作)
- 操作热点图(高频操作区域)
3. 示例查询界面:
```javascript
// React示例组件
function LogSearch() {
const [filters, setFilters] = useState({
userId: ,
operationType: ,
startDate: ,
endDate:
});
const handleSearch = () => {
// 调用API获取日志
api.searchLogs(filters).then(data => {
// 显示结果
});
};
return (
setFilters({...filters, userId: e.target.value})} />
{/* 其他筛选条件 */}
);
}
```
六、安全与合规考虑
1. 数据脱敏:
- 对敏感信息(如用户密码、支付信息)进行脱敏处理
- 日志访问权限严格控制
2. 存储安全:
- 日志数据加密存储
- 定期备份与异地容灾
3. 合规性:
- 满足GDPR、CCPA等数据保护法规
- 保留期限符合业务需求和法律要求
七、测试与部署
1. 测试用例:
- 正常操作日志记录
- 并发操作日志完整性
- 异常操作错误处理
- 日志查询性能
2. 部署方案:
- 灰度发布,先在小范围环境验证
- 监控日志系统性能指标
- 制定回滚方案
八、维护与优化
1. 定期维护:
- 清理过期日志
- 优化索引性能
- 更新查询界面
2. 性能优化:
- 对高频查询字段建立索引
- 实现日志分片存储
- 考虑使用冷热数据分离架构
九、问题与解决方案
1. 问题:高并发时日志写入性能下降
解决方案:采用批量写入+异步队列方式
2. 问题:日志数据量过大
解决方案:实施分级存储策略,热数据存ES,冷数据存对象存储
3. 问题:敏感信息泄露风险
解决方案:实施字段级加密和动态脱敏
十、后续规划
1. 增加AI异常检测,自动识别可疑操作
2. 实现操作日志的实时告警功能
3. 开发更直观的操作路径分析可视化
4. 探索区块链技术用于不可篡改的日志存证
此开发记录可根据实际项目需求和技术栈进行调整,核心是建立可追溯、可审计、高性能的用户操作日志系统。