Skip to content

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           │
└───────────────────┘


┌───────────────────┐
│ 创建/返回实例      │
└───────────────────┘