datai/datai-scenes/datai-scene-salesforce/docs/decisions/adr/0024-logging.md
Kris 2e6f087732 docs: 完成REQ-010-17和REQ-010-2的文档创建
- 完成REQ-010-17(性能优化和限流处理)的所有6个阶段
  - 创建ADR文档:0026-performance-optimization.md
  - 创建Prompt文档:027-performance-optimization.md
  - 创建会话记录:20260119-performance-optimization.md
  - 创建变更记录:20260119-performance-optimization.md
  - 创建复盘报告:20260119-performance-optimization-retro.md
  - 更新index.md和CHANGELOG.md

- 完成REQ-010-2(基础实体类和Mapper创建)的前3个阶段
  - 更新ADR文档:0011-entity-mapper-create.md
  - 创建Prompt文档:002-entity-mapper-create.md
  - 更新index.md

所有文档均按照SSOT方法论创建,包括需求定义、架构决策、提示词资产化、执行会话、变更记录和闭环复盘。
2026-01-19 10:06:09 +08:00

268 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构决策记录 - 详细日志记录和查询
## 背景
在实现 Salesforce 元数据拉取和部署功能后,需要记录作业的详细执行日志,支持日志查询和导出。当前系统缺乏详细日志记录和查询功能,无法追溯作业的执行过程,无法及时发现和处理作业执行中的问题。
面临的问题:
1. 无法记录作业的详细执行日志
2. 无法查询作业的执行日志
3. 无法导出作业的执行日志
4. 无法分析作业的执行日志
约束条件:
1. 必须基于现有的 Spring Boot 3 + Vue 3 技术栈
2. 必须遵循 Authentication.canvas 中定义的架构和调用关系
3. 必须在 datai-salesforce-metadata 模块下实现
4. 必须使用 MyBatis Plus 作为持久层框架
5. 日志记录和查询性能必须满足要求,不能影响作业执行
相关的业务需求:
1. 日志记录 - 记录作业的详细执行日志
2. 日志查询 - 查询作业的执行日志
3. 日志导出 - 导出作业的执行日志
4. 日志分析 - 分析作业的执行日志
## 决策
### 1. 日志记录方案
**决策**: 使用异步日志记录,使用日志框架记录日志。
**理由**:
- 异步日志记录可以避免阻塞主线程,不影响作业执行性能
- 日志框架(如 Log4j2、SLF4J提供了丰富的日志功能易于使用和维护
- 支持多种日志级别INFO、WARN、ERROR便于日志分类和管理
- 支持日志格式化和日志输出到多种目标(文件、数据库、消息队列等)
**实现方案**:
- 创建 LogLevel 枚举定义日志级别INFO、WARN、ERROR
- 创建 OperationLog 实体类,存储操作日志信息
- 创建 OperationLogMapper 接口,使用 MyBatis Plus 的 BaseMapper
- 创建 IOperationLogService 服务接口
- 创建 OperationLogServiceImpl 服务实现
- 使用异步日志记录,使用 @Async 注解实现异步
- 使用日志框架记录日志,使用 SLF4J 和 Log4j2
- 支持记录拉取作业日志、部署作业日志、Quick Deploy 作业日志、Destructive Changes 作业日志
- 支持记录日志级别、日志内容、日志时间、作业ID等信息
### 2. 日志查询方案
**决策**: 使用 MyBatis Plus 的 QueryWrapper 实现多条件查询,使用分页插件实现分页。
**理由**:
- MyBatis Plus 的 QueryWrapper 提供了丰富的查询方法,简化多条件查询逻辑
- 分页插件可以方便地实现分页查询
- 支持多种查询条件包括按作业ID、时间范围、日志级别、关键词等查询
- 查询性能良好,满足查询性能要求
**实现方案**:
- 创建 ILogQueryService 服务接口
- 创建 LogQueryServiceImpl 服务实现
- 使用 MyBatis Plus 的 QueryWrapper 实现多条件查询
- 使用 MyBatis Plus 的分页插件实现分页查询
- 支持按作业ID查询日志
- 支持按时间范围查询日志
- 支持按日志级别查询日志
- 支持按关键词查询日志
- 支持分页查询
### 3. 日志导出方案
**决策**: 使用文件导出库实现日志导出,使用流式处理大文件导出。
**理由**:
- 文件导出库(如 Apache POI、EasyExcel提供了丰富的文件导出功能易于使用和维护
- 支持多种文件格式文本文件、Excel 文件、CSV 文件)
- 流式处理可以避免内存溢出,支持大文件导出
- 导出性能良好,满足导出性能要求
**实现方案**:
- 创建 ILogExportService 服务接口
- 创建 LogExportServiceImpl 服务实现
- 使用 Apache POI 实现 Excel 文件导出
- 使用 EasyExcel 实现 Excel 文件导出(推荐,性能更好)
- 使用 Java IO 实现文本文件和 CSV 文件导出
- 使用流式处理大文件导出,避免内存溢出
- 支持导出为文本文件
- 支持导出为 Excel 文件
- 支持导出为 CSV 文件
### 4. 日志分析方案
**决策**: 使用聚合查询实现日志统计,使用图表展示分析结果。
**理由**:
- 聚合查询可以快速统计日志数量,提高查询性能
- 图表可以直观展示分析结果,便于用户理解
- 支持多种分析维度,包括按时间、按日志级别、按作业类型等分析
- 分析结果准确,满足分析准确性要求
**实现方案**:
- 创建 ILogAnalysisService 服务接口
- 创建 LogAnalysisServiceImpl 服务实现
- 使用 MyBatis Plus 的聚合查询实现日志统计
- 使用 ECharts 或其他图表库展示分析结果
- 支持统计错误日志数量
- 支持统计警告日志数量
- 支持统计信息日志数量
- 支持分析作业执行趋势
- 支持按时间分析日志
- 支持按日志级别分析日志
- 支持按作业类型分析日志
## 备选方案
### 方案 1: 使用 ELK Stack 实现日志管理
**优点**:
- ELK StackElasticsearch、Logstash、Kibana提供了强大的日志管理和分析功能
- 支持实时日志查询和分析
- 支持大规模日志存储和查询
**缺点**:
- 实现复杂,需要部署和维护 ELK Stack
- 增加系统复杂度
- 需要额外的服务器资源
**评估**: 不采用,实现复杂,增加系统复杂度
### 方案 2: 使用消息队列实现日志收集
**优点**:
- 消息队列可以异步收集日志,不影响作业执行
- 可以解耦日志记录和日志存储
- 支持分布式日志收集
**缺点**:
- 实现复杂,需要维护消息队列
- 增加系统复杂度
- 可能出现消息丢失或重复消费
**评估**: 不采用,实现复杂,增加系统复杂度
### 方案 3: 使用数据库存储日志
**优点**:
- 数据库存储简单,易于实现和维护
- 支持结构化查询
- 支持事务和索引
**缺点**:
- 数据库性能可能受到影响
- 存储空间占用较大
- 不适合大规模日志存储
**评估**: 采用,结合异步日志记录和分表存储,可以满足需求
## 影响
### 系统架构影响
- 新增 log 包包含日志记录和查询相关的服务、控制器、DTO、实体、Mapper、工具类
- 新增 OperationLog 实体类,新增 operation_log 数据库表
- 新增 IOperationLogService、ILogQueryService、ILogExportService、ILogAnalysisService 服务接口
- 新增 OperationLogServiceImpl、LogQueryServiceImpl、LogExportServiceImpl、LogAnalysisServiceImpl 服务实现
- 新增 LogQueryController、LogExportController、LogAnalysisController 控制器
### 开发流程影响
- 需要开发日志记录和查询相关的服务、控制器、DTO、实体、Mapper、工具类
- 需要创建数据库表和索引
- 需要配置日志框架和异步日志记录
- 需要编写单元测试和集成测试
### 运维管理影响
- 需要监控日志记录情况
- 需要定期清理过期的日志
- 需要监控日志存储空间
- 需要监控日志查询性能
## 风险
### 技术风险
- **日志记录性能风险**: 日志记录性能不佳可能影响作业执行
- **缓解措施**: 使用异步日志记录,使用日志框架,优化日志记录频率
- **查询性能风险**: 日志查询性能不佳可能影响用户体验
- **缓解措施**: 使用索引优化查询,使用分页查询,使用缓存提高查询性能
- **存储空间风险**: 日志过多可能占用大量存储空间
- **缓解措施**: 定期清理过期的日志,使用日志压缩,使用日志归档
- **导出性能风险**: 日志导出性能不佳可能导致导出失败
- **缓解措施**: 使用流式处理大文件导出,使用分批导出,使用异步导出
- **分析准确性风险**: 日志分析不准确可能导致误判
- **缓解措施**: 使用聚合查询,验证分析结果,提供分析结果导出
### 业务风险
- **日志记录失败风险**: 日志记录失败可能导致日志信息丢失
- **缓解措施**: 使用异步日志记录,记录日志记录失败日志,支持日志记录重试
- **日志查询失败风险**: 日志查询失败可能导致无法追溯作业执行过程
- **缓解措施**: 监控日志查询服务,支持日志查询服务重启,记录日志查询日志
### 实施风险
- **开发周期风险**: 日志记录和查询功能开发周期可能较长
- **缓解措施**: 分阶段实施,优先实现核心功能,逐步完善
- **测试风险**: 日志记录和查询功能测试可能较为复杂
- **缓解措施**: 编写详细的测试用例,使用自动化测试,进行充分的测试
## 回滚策略
如果决策实施后出现问题,可以采取以下回滚策略:
1. **禁用日志记录功能**: 通过配置文件禁用日志记录功能,不影响作业执行
2. **回滚日志记录代码**: 回滚日志记录相关的代码,恢复到之前的版本
3. **回滚数据库表**: 删除日志记录相关的数据库表,恢复到之前的数据库结构
4. **回滚配置文件**: 回滚日志记录相关的配置文件,恢复到之前的配置
## 验收标准
定义验证该决策有效性的具体标准和测试方法:
1. **功能完整性**: 所有日志记录和查询功能能够正常工作
- 测试方法: 手动测试日志记录、日志查询、日志导出、日志分析
2. **性能指标**: 日志记录和查询性能满足要求,不影响作业执行
- 测试方法: 性能测试,监控日志记录和查询性能,确保不影响作业执行
3. **完整性**: 日志信息完整详细,能够追溯作业执行过程
- 测试方法: 手动测试日志记录,确保日志信息完整详细
4. **代码规范性**: 代码符合项目编码规范,有清晰的注释
- 测试方法: 代码审查,检查代码规范和注释
5. **可维护性**: 代码结构清晰,易于扩展和维护
- 测试方法: 代码审查,检查代码结构和可维护性
6. **可测试性**: 代码易于单元测试和集成测试
- 测试方法: 单元测试和集成测试,确保测试覆盖率高
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照:
- [Authentication.canvas](../../Authentication.canvas) - 相关架构图
- **具体节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式
- **快照时间**: 2026-01-19 00:00:00
### Status
- [x] Draft
- [ ] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源:
- [REQ-010-15.md](../requirements/REQ-010-15.md) - 详细日志记录和查询需求文档
- [REQ-010.md](../requirements/REQ-010.md) - Salesforce元数据拉取和部署主需求文档
- [REQ-010-6.md](../requirements/REQ-010-6.md) - 元数据拉取核心功能需求文档
- [REQ-010-8.md](../requirements/REQ-010-8.md) - 元数据部署核心功能需求文档
- [REQ-010-14.md](../requirements/REQ-010-14.md) - 作业执行监控需求文档
- [metadata-module.md](../reference-code/com/docs/metadata-module.md) - Salesforce Metadata API 模块说明(唯一真源)
- [index.md](../reference-code/com/docs/index.md) - Salesforce SOAP API Java 客户端参考文档(唯一真源)