日志记录系统设计
对于生鲜软件这类对实时性和准确性要求高的系统,完善的日志记录至关重要:
1. 日志分级策略
- ERROR:严重错误(如支付失败、库存同步异常)
- WARN:潜在问题(如库存低于安全阈值)
- INFO:关键业务流程(订单状态变更、配送员分配)
- DEBUG:详细调试信息(API调用参数、数据库查询)
2. 核心日志字段
```json
{
"timestamp": "2023-11-15T14:30:22Z",
"level": "ERROR",
"service": "order-service",
"trace_id": "abc123xyz456",
"message": "库存不足无法完成订单",
"order_id": "ORD20231115001",
"sku": "FRUIT-APPLE-001",
"required_qty": 10,
"available_qty": 5,
"stack_trace": "..."
}
```
3. 生鲜业务特有日志点
- 库存变更:入库、出库、损耗记录
- 冷链监控:温度异常报警
- 配送时效:超时预警
- 质量检测:不合格品记录
万象源码部署优化方案
1. 部署架构建议
```
[客户端] ←HTTPS→ [负载均衡] ←gRPC→ [微服务集群]
↓
[分布式日志系统]
↓
[时序数据库(温度/时效)]
[关系型数据库(业务数据)]
```
2. 关键部署配置
日志收集配置(ELK示例)
```yaml
filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/fresh-app/*.log
json.keys_under_root: true
json.add_error_key: true
output.elasticsearch:
hosts: ["elk-server:9200"]
index: "fresh-app-logs-%{+yyyy.MM.dd}"
```
微服务日志上下文传递
```java
// Spring Cloud Sleuth示例
@Bean
public Tracer tracer() {
return Tracing.newBuilder()
.localServiceName("order-service")
.spanReporter(reporter)
.build()
.tracer();
}
// 在日志中自动添加traceId
@Slf4j
public class OrderService {
public void processOrder(String orderId) {
log.info("Processing order: {}", orderId);
// 业务逻辑...
}
}
```
3. 常见问题排查流程
1. 订单处理失败
- 检查`order-service`的ERROR日志
- 关联查看`inventory-service`的库存变更日志
- 确认支付网关回调日志
2. 配送超时
- 查询`delivery-service`的时效预警日志
- 对比GPS轨迹日志与规划路线
- 检查骑手APP的异常退出日志
3. 库存数据不一致
- 对比WMS系统日志与数据库事务日志
- 检查分布式锁获取失败记录
- 分析最终一致性处理日志
高级排查工具
1. 实时日志分析面板
- Grafana + Loki组合
- 预设生鲜业务关键指标仪表盘
2. 异常模式检测
- 使用ELK的机器学习功能检测异常模式
- 例如:特定时段频繁的库存锁定失败
3. 分布式追踪
- Jaeger/Zipkin集成
- 端到端跟踪生鲜商品的生命周期
最佳实践建议
1. 日志轮转策略
- 按大小和时间双重轮转
- 生鲜业务建议保留30天日志
2. 敏感信息处理
- 自动脱敏用户手机号、地址等信息
- 支付相关日志单独加密存储
3. 性能考虑
- 异步日志写入
- 生产环境禁用DEBUG级别日志
4. 灾备方案
- 本地日志+远程日志双重存储
- 关键业务日志实时同步到对象存储
通过以上方案,可以构建一个既满足生鲜业务特殊需求,又便于问题排查的日志系统,同时确保万象源码部署的稳定性和可维护性。