本项目采用统一的日志管理系统,支持模块化配置和多种运行模式。所有日志通过YAML配置文件进行集中管理,支持灵活的格式化、级别控制和文件轮转。
📅 完成时间: 2025年7月17日
🎯 实施状态: 100%完成,所有5个模块已全面部署统一日志系统
🔄 功能特性: 支持日志滚动、双重日志机制、任务特定日志
项目根目录/
├── config/
│ └── logging_config.yaml # 主配置文件
├── logs/ # 统一日志目录
│ ├── app.log # 主应用日志
│ ├── agent.log # 智能代理日志
│ ├── vanna.log # Vanna框架日志
│ ├── data_pipeline.log # 数据管道日志
│ └── react_agent.log # React Agent日志
├── core/logging/ # 核心日志管理
│ ├── __init__.py # 统一入口API
│ └── log_manager.py # 日志管理器
└── data_pipeline/training_data/ # 任务特定日志
└── {task_id}/
└── data_pipeline.log # 任务专用日志
模块 | 日志文件 | 状态 | 说明 |
---|---|---|---|
app | app.log |
✅ 已部署 | 主应用程序、API入口(unified_api.py)、通用功能 |
agent | agent.log |
✅ 已部署 | 智能代理相关功能(agent/*) |
vanna | vanna.log |
✅ 已部署 | Vanna框架相关(core/*, customllm/*) |
data_pipeline | data_pipeline.log |
✅ 已部署 | 数据处理管道(data_pipeline/*) |
react_agent | react_agent.log |
✅ 已部署 | React Agent模块(react_agent/*) |
📊 统计: 5个模块,100%完成统一日志部署
version: 1
# 全局配置
global:
base_level: INFO # 全局基础日志级别
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
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
DEBUG
: 详细的调试信息INFO
: 一般信息WARNING
: 警告信息ERROR
: 错误信息CRITICAL
: 严重错误%(asctime)s
: 时间戳%(levelname)s
: 日志级别%(name)s
: Logger名称%(message)s
: 日志消息%(filename)s
: 文件名%(lineno)d
: 行号%(user_id)s
: 用户ID(上下文)%(session_id)s
: 会话ID(上下文)enabled
: 是否启用轮转max_size
: 单个文件最大大小backup_count
: 保留的备份文件数量Data Pipeline模块支持双重日志机制(已全面实现):
logs/data_pipeline.log
✅data_pipeline/training_data/{task_id}/data_pipeline.log
✅from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger
# 初始化日志系统
init_data_pipeline_logging()
# 获取基础logger(仅写入全局日志)
logger = get_logger("ComponentName")
logger.info("这条日志会写入 logs/data_pipeline.log")
from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger
# 初始化日志系统
init_data_pipeline_logging()
# 获取任务特定logger(同时写入全局和任务日志)
task_id = "task_20250717_160000"
logger = get_logger("ComponentName", task_id)
# 这条日志会同时写入两个地方:
# 1. logs/data_pipeline.log
# 2. data_pipeline/training_data/task_20250717_160000/data_pipeline.log
logger.info("处理任务开始")
data_pipeline/training_data/
├── task_20250717_160000/
│ ├── data_pipeline.log # 任务专用日志
│ ├── task_config.json
│ ├── task_result.json
│ └── 其他任务文件...
├── task_20250717_170000/
│ ├── data_pipeline.log # 另一个任务的日志
│ └── 其他任务文件...
└── ...
# 在API调用中使用
from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger
def process_data_api(task_id: str):
init_data_pipeline_logging()
logger = get_logger("DataProcessor", task_id)
logger.info("API模式:开始处理数据")
# 处理逻辑...
logger.info("API模式:数据处理完成")
# 在命令行脚本中使用
from data_pipeline.dp_logging import init_data_pipeline_logging, get_logger
def main():
task_id = "manual_20250717_160000"
init_data_pipeline_logging()
logger = get_logger("TrainingScript", task_id)
logger.info("命令行模式:开始训练")
# 训练逻辑...
logger.info("命令行模式:训练完成")
if __name__ == "__main__":
main()
from core.logging import initialize_logging
# 初始化日志系统(使用默认配置文件)
initialize_logging()
# 使用自定义配置文件
initialize_logging("custom_config.yaml")
from core.logging import (
get_app_logger,
get_agent_logger,
get_vanna_logger,
get_data_pipeline_logger,
get_react_agent_logger
)
# 获取不同模块的logger
app_logger = get_app_logger("ComponentName")
agent_logger = get_agent_logger("ComponentName")
vanna_logger = get_vanna_logger("ComponentName")
data_logger = get_data_pipeline_logger("ComponentName")
react_logger = get_react_agent_logger("ComponentName")
from core.logging import set_log_context, clear_log_context
# 设置上下文信息
set_log_context(user_id="user123", session_id="sess456")
# 清除上下文
clear_log_context()
from core.logging import initialize_logging, get_app_logger
# 初始化
initialize_logging()
# 获取logger
logger = get_app_logger("MyComponent")
# 记录日志
logger.debug("调试信息")
logger.info("一般信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")
from core.logging import initialize_logging, get_app_logger, set_log_context
initialize_logging()
logger = get_app_logger("APIHandler")
# 设置用户上下文
set_log_context(user_id="user123", session_id="sess456")
# 这条日志会包含上下文信息
logger.info("用户请求处理开始")
config/logging_config.yaml
为新文件from core.logging import initialize_logging
initialize_logging("config/custom_logging.yaml")
from core.logging import get_logger
# 获取logger后动态调整级别
logger = get_logger("MyComponent", "app")
logger.setLevel(logging.DEBUG)
# 推荐格式
logger.info("用户登录成功", extra={"user_id": "123"})
logger.error("数据库连接失败", extra={"error": str(e)})
# 避免格式
logger.info("用户123登录成功") # 不易于查询和分析
try:
# 业务逻辑
result = process_data()
logger.info("数据处理成功")
except Exception as e:
logger.error(f"数据处理失败: {e}", exc_info=True)
raise
# 对于频繁调用的DEBUG日志,使用条件判断
if logger.isEnabledFor(logging.DEBUG):
logger.debug(f"复杂计算结果: {expensive_operation()}")
logs/
目录权限initialize_logging()
已调用console.enabled
设置import logging
logging.basicConfig(level=logging.DEBUG)
from core.logging import initialize_logging
initialize_logging()
from core.logging import _log_manager
print(_log_manager.config)
本项目的日志系统已成功提供了灵活、可扩展的日志管理解决方案。通过统一的配置文件和模块化的设计,实现了不同模块的独立日志管理需求。Data Pipeline模块的双重日志机制特别适合需要任务追踪的场景。
正确使用日志系统可以大大提高问题诊断效率和系统可维护性。当前系统已在生产环境中充分利用不同级别的日志记录,为监控和故障排除提供有力支持。
部署完成时间: 2025年7月17日
系统状态: 生产就绪,所有功能正常运行