Read file: docs/日志服务使用清单.md Read file: docs/全局log服务改造方案_优化版.md 现在我来为您创建一份完整的日志规范化改造文档:
Read file: docs/日志服务改造检查报告.md 现在我来创建一份完整的日志规范化改造文档:
将项目从分散的日志管理方式统一为中央化的日志管理系统,实现:
经过代码分析,发现以下主要问题:
日志体系分散:存在3套独立的日志管理器
core/logging/log_manager.py
- 中央日志管理器data_pipeline/dp_logging/manager.py
- 数据管道独立日志react_agent/logger.py
- React Agent独立日志print语句残留:多个模块仍使用print输出
配置不统一:各模块使用不同的日志配置方式
文件管理混乱:日志文件分散在不同目录
项目根目录/ ├── 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
模块 | 日志文件 | 主要组件 | 说明 |
---|---|---|---|
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模块 |
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
# 删除独立日志文件
rm react_agent/logger.py
react_agent/api.py
# 替换现有的日志导入
from core.logging import get_app_logger
# 初始化日志
logger = get_app_logger("ReactAgentAPI")
react_agent/agent.py
# 替换现有的日志导入
from core.logging import get_app_logger
# 初始化日志
logger = get_app_logger("CustomReactAgent")
react_agent/sql_tools.py
# 替换现有的日志导入
from core.logging import get_app_logger
# 初始化日志
logger = get_app_logger("SQLTools")
data_pipeline/dp_logging/init.py
"""
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
data_pipeline/schema_workflow.py
# 替换现有的日志导入
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
# 在文件开头添加
from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger
# 初始化日志
init_data_pipeline_logging()
logger = get_logger("RunTraining")
# 替换所有print语句
# 原代码:print("正在检查嵌入模型连接...")
# 新代码:logger.info("正在检查嵌入模型连接...")
文件路径 | 当前状态 | 改造方式 | 优先级 |
---|---|---|---|
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语句 | 保留(示例程序) | 低 |
# 错误信息 -> 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}")
【补充】
建议使用正则表达式(如print\(
)或脚本工具,批量扫描全项目(排除./test、./doc和test_*.py文件)中的print语句,形成详细的待改造文件清单,确保无遗漏。
# 启动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
# 测试data_pipeline命令行
python data_pipeline/trainer/run_training.py
# 检查data_pipeline.log
tail -f logs/data_pipeline.log
【补充】
在unified_api.py文件开头,务必添加日志系统初始化代码:
from core.logging import initialize_logging, get_app_logger
initialize_logging()
logger = get_app_logger("App")
启动服务后,logs/目录下应该包含:
app.log
- 主应用日志agent.log
- Agent模块日志vanna.log
- Vanna相关日志data_pipeline.log
- 数据管道日志react_agent.log
- React Agent日志【补充】
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")
便于日志聚合和后续分析。
【补充】
通过本次改造,项目将实现:
改造完成后,项目的日志管理将更加规范、高效和易于维护。