Logger 架构文档
模块路径: FQBase.Core.logger源码: [logger.py](file:///Users/A.D.189/FQuant/FQuant.Server/FQBase/FQBase/Core/logger.py)
一、整体架构
┌─────────────────────────────────────────────────────────────────┐
│ 应用层代码 │
│ get_logger('MarketData'), get_logger('Strategy'), etc. │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ get_logger(name) │
│ ───────────────── │
│ 线程安全单例工厂函数 │
└─────────────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ FQLogger._instances │
│ Dict[str, FQLogger] │
├─────────────────────────────────────────────────────────────────┤
│ 'MarketData' → FQLogger(name='MarketData') │
│ 'Strategy' → FQLogger(name='Strategy') │
│ 'Trade' → FQLogger(name='Trade') │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ logging.getLogger(name) │
│ 标准库 Logger 实例 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Handler Layer │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ StreamHandler │ │ RotatingFileHandler│ │
│ │ (控制台输出) │ │ (文件轮转) │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘二、组件架构
FQLogger
├── 类级别组件(类变量)
│ ├── _instances: Dict[str, 'FQLogger'] # 实例缓存
│ ├── _initialized: bool # 初始化标志
│ ├── _config_path: Optional[str] # 配置文件路径
│ ├── _init_lock: threading.Lock # 初始化锁
│ └── _instances_lock: threading.Lock # 实例锁
│
└── 实例级别组件(实例变量)
├── _name: str # Logger 名称
└── _logger: logging.Logger # 底层标准库 Logger三、初始化流程
get_logger() 调用
│
▼
┌───────────────────┐
│ 检查是否已初始化 │ ──→ 已初始化 ──→ 跳到步骤 4
└───────────────────┘
│ 未初始化
▼
┌───────────────────┐
│ 获取初始化锁 │ ──→ 获取失败 ──→ 等待后重试
└───────────────────┘
│ 获取成功
▼
┌───────────────────┐
│ 双重检查已初始化 │ ──→ 已初始化 ──→ 释放锁,跳到步骤 4
└───────────────────┘
│ 未初始化
▼
┌───────────────────┐
│ 设置第三方库日志级别 │
│ (pymongo, asyncio, │
│ matplotlib) │
└───────────────────┘
│
▼
┌───────────────────┐
│ 确定配置路径 │
│ 1. config_path │
│ 2. FQ_LOGGING_ │
│ CONFIG 环境变量 │
│ 3. Config/logging.yaml │
└───────────────────┘
│
▼
┌───────────────────┐
│ 注册 atexit │
│ (logging.shutdown)│
└───────────────────┘
│
▼
┌───────────────────┐
│ 加载配置 │
│ │
│ ┌─────────────────┐│
│ │配置文件存在? ││
│ └─────────────────┘│
│ │ │
│ 是│ │否
│ ▼ ▼
│ ┌────────┐ ┌────────────┐
│ │yaml. │ │_setup_ │
│ │safe_ │ │default_ │
│ │load() │ │logging() │
│ └────────┘ └────────────┘
└───────────────────┘
│
▼
┌───────────────────┐
│ 设置 _initialized │
│ = True │
└───────────────────┘
│
▼
┌───────────────────┐
│ 创建/返回实例 │
└───────────────────┘