Read file: docs/日志服务使用清单.md Read file: docs/全局log服务改造方案_优化版.md 现在我来为您创建一份完整的日志规范化改造文档: Read file: docs/日志服务改造检查报告.md 现在我来创建一份完整的日志规范化改造文档: # 日志规范化改造实施方案 ## 1. 项目概述 ### 1.1 改造目标 将项目从分散的日志管理方式统一为中央化的日志管理系统,实现: - 统一的日志服务架构 - 模块独立的日志配置 - 支持API和命令行两种运行模式 - 自动日志轮转和清理 - 灵活的上下文管理 ### 1.2 当前问题分析 经过代码分析,发现以下主要问题: 1. **日志体系分散**:存在3套独立的日志管理器 - `core/logging/log_manager.py` - 中央日志管理器 - `data_pipeline/dp_logging/manager.py` - 数据管道独立日志 - `react_agent/logger.py` - React Agent独立日志 2. **print语句残留**:多个模块仍使用print输出 3. **配置不统一**:各模块使用不同的日志配置方式 4. **文件管理混乱**:日志文件分散在不同目录 ## 2. 改造方案设计 ### 2.1 统一日志架构 项目根目录/ ├── core/logging/ # 中央日志服务 │ ├── __init__.py # 统一入口 │ └── log_manager.py # 核心管理器 ├── config/ │ └── logging_config.yaml # 统一配置文件 ├── logs/ # 统一日志目录 │ ├── app.log # 主应用日志 │ ├── agent.log # Agent模块日志 │ ├── vanna.log # Vanna相关日志 │ ├── data_pipeline.log # 数据管道日志 │ └── react_agent.log # React Agent日志 └── 各业务模块/ # 使用统一日志API ### 2.2 模块日志分配 | 模块 | 日志文件 | 主要组件 | 说明 | | ----------------- | ------------------- | -------------------------------------------------------- | ---------------- | | **App** | `app.log` | unified_api.py, citu_app.py, common/* | 主应用和通用功能 | | **Agent** | `agent.log` | agent/*, agent/tools/* | 智能代理相关 | | **Vanna** | `vanna.log` | core/*, customllm/*, customembedding/*, custompgvector/* | Vanna框架相关 | | **Data Pipeline** | `data_pipeline.log` | data_pipeline/* | 数据处理管道 | | **React Agent** | `react_agent.log` | react_agent/* | React Agent模块 | ## 3. 具体实施步骤 ### 3.1 第一步:完善配置文件 #### 3.1.1 更新config/logging_config.yaml ```yaml version: 1 # 全局配置 global: base_level: INFO # 默认配置(用于app.log) default: level: INFO console: enabled: true level: INFO format: "%(asctime)s [%(levelname)s] %(name)s: %(message)s" file: enabled: true level: DEBUG filename: "app.log" format: "%(asctime)s [%(levelname)s] [%(name)s] [user:%(user_id)s] [session:%(session_id)s] %(filename)s:%(lineno)d - %(message)s" rotation: enabled: true max_size: "50MB" backup_count: 10 # 模块特定配置 modules: app: level: INFO console: enabled: true level: INFO format: "%(asctime)s [%(levelname)s] %(name)s: %(message)s" file: enabled: true level: DEBUG filename: "app.log" format: "%(asctime)s [%(levelname)s] [%(name)s] [user:%(user_id)s] [session:%(session_id)s] %(filename)s:%(lineno)d - %(message)s" rotation: enabled: true max_size: "50MB" backup_count: 10 agent: level: DEBUG console: enabled: true level: INFO format: "%(asctime)s [%(levelname)s] Agent: %(message)s" file: enabled: true level: DEBUG filename: "agent.log" format: "%(asctime)s [%(levelname)s] [%(name)s] [user:%(user_id)s] [session:%(session_id)s] %(filename)s:%(lineno)d - %(message)s" rotation: enabled: true max_size: "30MB" backup_count: 8 vanna: level: DEBUG console: enabled: true level: INFO format: "%(asctime)s [%(levelname)s] Vanna: %(message)s" file: enabled: true level: DEBUG filename: "vanna.log" format: "%(asctime)s [%(levelname)s] [%(name)s] %(filename)s:%(lineno)d - %(message)s" rotation: enabled: true max_size: "20MB" backup_count: 5 data_pipeline: level: DEBUG console: enabled: true level: INFO format: "%(asctime)s [%(levelname)s] Pipeline: %(message)s" file: enabled: true level: DEBUG filename: "data_pipeline.log" format: "%(asctime)s [%(levelname)s] [%(name)s] %(filename)s:%(lineno)d - %(message)s" rotation: enabled: true max_size: "20MB" backup_count: 5 react_agent: level: DEBUG console: enabled: true level: INFO format: "%(asctime)s [%(levelname)s] ReactAgent: %(message)s" file: enabled: true level: DEBUG filename: "react_agent.log" format: "%(asctime)s [%(levelname)s] [%(name)s] [user:%(user_id)s] [session:%(session_id)s] %(filename)s:%(lineno)d - %(message)s" rotation: enabled: true max_size: "30MB" backup_count: 8 ``` ### 3.2 第二步:改造React Agent模块 #### 3.2.1 删除独立日志管理器 ```bash # 删除独立日志文件 rm react_agent/logger.py ``` #### 3.2.2 修改React Agent模块代码 **react_agent/api.py** ```python # 替换现有的日志导入 from core.logging import get_app_logger # 初始化日志 logger = get_app_logger("ReactAgentAPI") ``` **react_agent/agent.py** ```python # 替换现有的日志导入 from core.logging import get_app_logger # 初始化日志 logger = get_app_logger("CustomReactAgent") ``` **react_agent/sql_tools.py** ```python # 替换现有的日志导入 from core.logging import get_app_logger # 初始化日志 logger = get_app_logger("SQLTools") ``` ### 3.3 第三步:改造Data Pipeline模块 #### 3.3.1 创建统一日志接口 **data_pipeline/dp_logging/__init__.py** ```python """ Data Pipeline 统一日志管理 支持API和命令行两种模式 """ from core.logging import get_data_pipeline_logger, initialize_logging import os def init_data_pipeline_logging(): """初始化data_pipeline日志系统""" # 确保日志系统已初始化 initialize_logging() def get_logger(name: str, task_id: str = None): """ 获取data_pipeline专用logger Args: name: logger名称 task_id: 任务ID(可选,用于任务特定日志) Returns: 配置好的logger实例 """ logger = get_data_pipeline_logger(name) # 如果提供了task_id,添加任务特定的文件处理器 if task_id: import logging from pathlib import Path # 创建任务特定的日志文件 task_log_file = Path(f"data_pipeline/training_data/{task_id}/data_pipeline.log") task_log_file.parent.mkdir(parents=True, exist_ok=True) # 创建任务特定的文件处理器 task_handler = logging.FileHandler(task_log_file, encoding='utf-8') task_handler.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s [%(levelname)s] [%(name)s] %(filename)s:%(lineno)d - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) task_handler.setFormatter(formatter) # 添加到logger logger.addHandler(task_handler) return logger ``` #### 3.3.2 修改Data Pipeline主要文件 **data_pipeline/schema_workflow.py** ```python # 替换现有的日志导入 from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger # 在类初始化时调用 init_data_pipeline_logging() logger = get_logger("SchemaWorkflow", task_id) ``` **data_pipeline/trainer/run_training.py** ```python # 在文件开头添加 from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger # 初始化日志 init_data_pipeline_logging() logger = get_logger("RunTraining") # 替换所有print语句 # 原代码:print("正在检查嵌入模型连接...") # 新代码:logger.info("正在检查嵌入模型连接...") ``` ### 3.4 第四步:清理print语句 #### 3.4.1 需要改造的文件清单 | 文件路径 | 当前状态 | 改造方式 | 优先级 | |----------|----------|----------|--------| | `data_pipeline/task_executor.py` | print语句 | 替换为logger | 高 | | `data_pipeline/config.py` | print语句 | 替换为logger | 高 | | `data_pipeline/trainer/run_training.py` | print语句 | 替换为logger | 高 | | `data_pipeline/validators/sql_validate_cli.py` | print语句 | 保留(CLI工具) | 中 | | `data_pipeline/validators/sql_validation_example.py` | print语句 | 保留(示例程序) | 低 | #### 3.4.2 print语句替换规则 ```python # 错误信息 -> logger.error() print(f"错误: {error_message}") # 改为: logger.error(f"错误: {error_message}") # 警告信息 -> logger.warning() print(f"警告: {warning_message}") # 改为: logger.warning(f"警告: {warning_message}") # 调试信息 -> logger.debug() print(f"调试: {debug_info}") # 改为: logger.debug(f"调试: {debug_info}") # 一般信息 -> logger.info() print(f"信息: {info_message}") # 改为: logger.info(f"信息: {info_message}") ``` 【补充】 #### 3.4.3 批量扫描print语句建议 建议使用正则表达式(如`print\(`)或脚本工具,批量扫描全项目(排除./test、./doc和test_*.py文件)中的print语句,形成详细的待改造文件清单,确保无遗漏。 ### 3.5 第五步:验证和测试 #### 3.5.1 API模式测试 ```bash # 启动API服务 python unified_api.py # 检查日志文件生成 ls -la logs/ # 应该看到:app.log, agent.log, vanna.log, data_pipeline.log, react_agent.log # 调用API测试日志 curl -X POST http://localhost:5000/api/v0/ask_agent \ -H "Content-Type: application/json" \ -d '{"question": "test question", "user_id": "test_user"}' # 检查agent.log tail -f logs/agent.log ``` #### 3.5.2 命令行模式测试 ```bash # 测试data_pipeline命令行 python data_pipeline/trainer/run_training.py # 检查data_pipeline.log tail -f logs/data_pipeline.log ``` 【补充】 ### 3.6 API入口日志初始化与写入 #### 3.6.1 unified_api.py日志初始化 - 在unified_api.py文件开头,务必添加日志系统初始化代码: ```python from core.logging import initialize_logging, get_app_logger initialize_logging() logger = get_app_logger("App") ``` - 替换所有print和异常输出为logger调用。 - 确保API处理函数(如ask_agent)有logger.info/debug/error等调用。 - 启动unified_api.py后,logs/app.log应由该文件负责写入。 #### 3.6.2 agent.log日志写入排查建议 - 检查agent相关模块是否用统一日志服务(如get_app_logger("Agent"))。 - 检查unified_api.py是否初始化了日志系统。 - 检查日志配置文件中agent部分是否正确。 - 若调用ask_agent API未见agent.log写入,需重点排查上述环节。 ## 4. 改造完成标准 ### 4.1 功能验证清单 - [ ] 启动unified_api.py时自动初始化日志系统 - [ ] 各模块日志正确写入对应的日志文件 - [ ] 日志文件自动轮转功能正常 - [ ] 控制台和文件输出格式正确 - [ ] 上下文信息(user_id, session_id)正确显示 - [ ] 错误降级到控制台功能正常 ### 4.2 文件验证清单 - [ ] 删除react_agent/logger.py - [ ] 删除data_pipeline/dp_logging/manager.py - [ ] 更新所有模块的日志导入 - [ ] 替换所有print语句 - [ ] 配置文件正确更新 ### 4.3 日志文件验证 启动服务后,logs/目录下应该包含: - `app.log` - 主应用日志 - `agent.log` - Agent模块日志 - `vanna.log` - Vanna相关日志 - `data_pipeline.log` - 数据管道日志 - `react_agent.log` - React Agent日志 【补充】 ### 4.4 logger命名规范建议 - 建议所有logger实例命名时,使用模块名或功能名作为参数,如: ```python logger = get_app_logger("Agent") logger = get_app_logger("Vanna") logger = get_app_logger("DataPipeline") logger = get_app_logger("ReactAgent") logger = get_app_logger("App") ``` - 便于日志聚合和后续分析。 ## 5. 注意事项和风险控制 ### 5.1 兼容性考虑 - 保留CLI工具的print输出,确保用户体验 - 示例程序可以保留print,便于演示 - 确保API和命令行两种模式都能正常工作 ### 5.2 性能考虑 - 日志文件轮转避免单个文件过大 - 合理设置日志级别,避免过多DEBUG输出 - 考虑异步日志写入(如需要) ### 5.3 错误处理 - 日志目录创建失败时降级到控制台 - 配置文件加载失败时使用默认配置 - 文件写入失败时不影响主程序运行 【补充】 ### 5.4 日志异常处理与降级机制 - 日志系统初始化失败时,自动降级为控制台输出,保证主程序不因日志异常而中断。 - 日志目录创建失败时,自动切换为当前目录或控制台输出。 - 配置文件加载失败时,自动使用默认配置。 - 文件写入失败时,日志输出降级为console,主程序继续运行。 ## 6. 后续优化建议 ### 6.1 短期优化(1-2周) 1. 根据实际使用情况调整日志级别 2. 优化日志格式,提高可读性 3. 添加日志文件大小监控 ### 6.2 中期优化(1-3个月) 1. 实现结构化日志(JSON格式) 2. 添加日志分析和统计功能 3. 集成日志管理系统(如ELK) ### 6.3 长期优化(3-6个月) 1. 实现异步日志写入 2. 添加日志压缩和归档 3. 实现分布式日志收集 ## 7. 总结 通过本次改造,项目将实现: - **统一管理**:所有模块使用同一套日志系统 - **模块独立**:不同模块的日志分离存储 - **配置灵活**:通过YAML文件统一配置 - **易于维护**:标准化的日志格式和API - **高可用性**:完善的错误处理和降级机制 改造完成后,项目的日志管理将更加规范、高效和易于维护。