日志记录最佳实践
对于生鲜电商类软件,完善的日志系统是问题排查的关键。以下是日志记录的优化建议:
1. 日志分级策略
- ERROR: 严重错误(如支付失败、库存超卖、订单状态异常)
- WARN: 潜在问题(如库存预警、配送延迟预警)
- INFO: 关键业务流程(订单创建、支付成功、配送状态变更)
- DEBUG: 开发调试信息(API调用参数、数据转换过程)
- TRACE: 详细追踪(SQL语句、外部服务调用细节)
2. 生鲜业务关键日志点
```java
// 示例:订单处理关键日志
@Transactional
public Order createOrder(OrderRequest request) {
log.info("开始创建订单,用户ID:{}, 商品列表:{}", request.getUserId(), request.getItems());
// 库存检查
InventoryCheckResult check = inventoryService.checkStock(request.getItems());
if (!check.isAvailable()) {
log.warn("库存不足,商品ID:{}, 需求量:{}, 可用量:{}",
check.getShortageItems(), request.getItems(), check.getAvailableStock());
throw new BusinessException("部分商品库存不足");
}
// 支付处理
try {
PaymentResult payment = paymentService.process(request.getPaymentInfo());
log.info("支付成功,订单ID:{}, 交易号:{}, 金额:{}",
payment.getOrderId(), payment.getTransactionId(), payment.getAmount());
} catch (PaymentException e) {
log.error("支付失败,订单ID:{}, 错误信息:{}", request.getOrderId(), e.getMessage(), e);
throw;
}
// 配送安排
DeliverySchedule schedule = deliveryService.schedule(request);
log.info("配送安排成功,订单ID:{}, 预计送达时间:{}",
schedule.getOrderId(), schedule.getEstimatedTime());
}
```
万象源码部署问题排查指南
1. 部署前检查清单
- 环境一致性:确保开发、测试、生产环境版本一致
- 依赖管理:
- 检查`pom.xml`/`build.gradle`中的依赖版本
- 验证第三方服务(支付、短信、地图API)的密钥配置
- 配置文件:
- `application.yml`/`application.properties`中的数据库连接
- 缓存配置(Redis/Memcached)
- 文件存储路径(生鲜图片、证书文件)
2. 常见部署问题及解决方案
问题1:服务启动失败
- 现象:应用启动时抛出异常,无法监听端口
- 排查步骤:
1. 检查日志开头是否有`BeanCreationException`或`BindException`
2. 验证端口是否被占用:`netstat -tulnp | grep <端口>`
3. 检查数据库连接配置:
```yaml
spring:
datasource:
url: jdbc:mysql://
:/?useSSL=false
username:
password:
```
4. 验证表结构是否已初始化(检查`schema.sql`或Flyway迁移脚本)
问题2:生鲜数据同步失败
- 现象:商品价格/库存未更新
- 排查步骤:
1. 检查定时任务配置(`@Scheduled`注解或Quartz配置)
2. 验证消息队列连接(RabbitMQ/Kafka):
```java
@Bean
public ConnectionFactory rabbitConnectionFactory() {
CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setHost("rabbitmq-host");
factory.setUsername("guest");
factory.setPassword("guest");
return factory;
}
```
3. 检查同步日志中是否有`RetryableException`或网络超时
问题3:支付回调处理异常
- 现象:支付成功但订单状态未更新
- 排查步骤:
1. 检查支付网关回调地址配置
2. 验证签名验证逻辑:
```java
public boolean verifySignature(Map params, String secret) {
// 实现支付平台要求的签名算法
}
```
3. 检查异步通知处理是否被标记为幂等(防止重复处理)
3. 高级排查工具
1. Arthas:在线诊断Java应用
```bash
启动Arthas
java -jar arthas-boot.jar
常用命令
dashboard 查看实时监控
trace com.example.OrderService createOrder 追踪方法调用
watch com.example.InventoryService checkStock {params,returnObj} -x 2 查看方法参数和返回值
```
2. JProfiler/VisualVM:分析内存泄漏和性能瓶颈
3. ELK Stack:集中式日志管理
```
生鲜应用 → Filebeat → Logstash → Elasticsearch → Kibana
```
推荐日志配置(Logback示例)
```xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
logs/fresh-app.log
logs/fresh-app.%d{yyyy-MM-dd}.log
30
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
logs/fresh-error.log
WARN
logs/fresh-error.%d{yyyy-MM-dd}.%i.log
100MB
90
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
```
部署后验证清单
1. 基础功能验证:
- 商品浏览与搜索
- 购物车操作
- 订单创建与支付
- 配送地址管理
2. 生鲜特性验证:
- 保质期预警(系统是否自动标记临近保质期商品)
- 冷链物流跟踪(温度、位置更新)
- 批次管理(同一商品不同批次库存隔离)
3. 性能验证:
- 高并发场景下的订单处理能力
- 数据库查询响应时间
- 缓存命中率
通过完善的日志系统和结构化的部署排查流程,可以显著提升生鲜电商系统的稳定性和问题解决效率。