GeWuYou a79f02c987 docs(api): 添加 Core API 参考文档与事件系统接口文档
- 新增 Core API 参考文档,涵盖架构与模块、数据模型与系统、命令与查询等核心组件
- 添加事件系统接口详细文档,包括 IEvent、IEventBus、IUnRegister 等接口说明
- 提供完整的 API 使用示例路径、最佳实践与性能建议
- 包含架构图、依赖关系图与故障排查指南
- 添加测试用例参考与扩展方法说明
- [skip ci]
2026-01-21 23:45:10 +08:00

404 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 日志系统
<cite>
**本文引用的文件**
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs)
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs)
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs)
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs)
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs)
- [README.md](file://GFramework.Core/logging/README.md)
- [LoggerTests.cs](file://GFramework.Core.Tests/logging/LoggerTests.cs)
- [ConsoleLoggerTests.cs](file://GFramework.Core.Tests/logging/ConsoleLoggerTests.cs)
- [LoggerFactoryTests.cs](file://GFramework.Core.Tests/logging/LoggerFactoryTests.cs)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [组件详解](#组件详解)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 GFramework 日志系统的技术文档,围绕日志抽象层、控制台输出、工厂模式与解析器、日志级别与最佳实践展开,帮助开发者快速理解并扩展日志能力,构建可观测的游戏架构。
## 项目结构
日志系统位于 GFramework.Core 与 GFramework.Core.Abstractions 两个项目中分别提供抽象接口与具体实现Godot 平台另提供 GodotLogger 等扩展(本篇聚焦核心日志体系)。
```mermaid
graph TB
subgraph "抽象层"
ILog["ILogger 接口"]
IFac["ILoggerFactory 接口"]
IFacP["ILoggerFactoryProvider 接口"]
Lvl["LogLevel 枚举"]
end
subgraph "核心实现"
Abs["AbstractLogger 抽象基类"]
Con["ConsoleLogger 控制台实现"]
Fac["ConsoleLoggerFactory 工厂"]
FacP["ConsoleLoggerFactoryProvider 工厂提供程序"]
Res["LoggerFactoryResolver 解析器"]
end
ILog --> Abs
IFac --> Fac
IFacP --> FacP
Lvl --> Abs
Lvl --> Con
Lvl --> Fac
Lvl --> FacP
Abs --> Con
FacP --> Fac
Res --> FacP
```
图表来源
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L8-L314)
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs#L6-L15)
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs#L6-L19)
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L6-L37)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L10-L12)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L10-L14)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L8-L20)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L8-L24)
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L8-L26)
章节来源
- [README.md](file://GFramework.Core/logging/README.md#L1-L364)
## 核心组件
- 抽象接口层:定义日志记录器、工厂、工厂提供程序与日志级别的统一契约。
- 抽象基类:封装级别判断、格式化与异常处理,子类仅需实现 Write。
- 具体实现ConsoleLogger 提供控制台输出与彩色打印ConsoleLoggerFactory/Provider 提供实例创建LoggerFactoryResolver 统一解析与配置。
章节来源
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L8-L314)
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs#L6-L15)
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs#L6-L19)
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L6-L37)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L10-L12)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L10-L14)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L8-L20)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L8-L24)
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L8-L26)
## 架构总览
日志系统采用“接口抽象 + 工厂 + 解析器”的分层设计,便于替换输出目标(控制台、文件、网络等),并通过解析器集中管理默认提供程序与全局最小级别。
```mermaid
classDiagram
class ILogger {
+Name() string
+IsTraceEnabled() bool
+IsDebugEnabled() bool
+IsInfoEnabled() bool
+IsWarnEnabled() bool
+IsErrorEnabled() bool
+IsFatalEnabled() bool
+IsEnabledForLevel(level) bool
+Trace(...)
+Debug(...)
+Info(...)
+Warn(...)
+Error(...)
+Fatal(...)
}
class ILoggerFactory {
+GetLogger(name, minLevel) ILogger
}
class ILoggerFactoryProvider {
+MinLevel : LogLevel
+CreateLogger(name) ILogger
}
class LogLevel {
<<enum>>
+Trace
+Debug
+Info
+Warning
+Error
+Fatal
}
class AbstractLogger {
-string _name
+Name() string
#IsEnabled(level) bool
#IsTraceEnabled() bool
#IsDebugEnabled() bool
#IsInfoEnabled() bool
#IsWarnEnabled() bool
#IsErrorEnabled() bool
#IsFatalEnabled() bool
#IsEnabledForLevel(level) bool
#Trace(...)
#Debug(...)
#Info(...)
#Warn(...)
#Error(...)
#Fatal(...)
#Write(level, message, exception) void
}
class ConsoleLogger {
-bool _useColors
-TextWriter _writer
#Write(level, message, exception) void
}
class ConsoleLoggerFactory {
+GetLogger(name, minLevel) ILogger
}
class ConsoleLoggerFactoryProvider {
+MinLevel : LogLevel
+CreateLogger(name) ILogger
}
class LoggerFactoryResolver {
+Provider : ILoggerFactoryProvider
+MinLevel : LogLevel
}
ILogger <|.. AbstractLogger
AbstractLogger <|-- ConsoleLogger
ILoggerFactory <|.. ConsoleLoggerFactory
ILoggerFactoryProvider <|.. ConsoleLoggerFactoryProvider
LogLevel --> AbstractLogger : "minLevel"
LogLevel --> ConsoleLogger : "minLevel"
LogLevel --> ConsoleLoggerFactory : "minLevel"
LogLevel --> ConsoleLoggerFactoryProvider : "MinLevel"
LoggerFactoryResolver --> ConsoleLoggerFactoryProvider : "默认提供程序"
ConsoleLoggerFactory --> ConsoleLogger : "创建"
ConsoleLoggerFactoryProvider --> ConsoleLoggerFactory : "委托"
```
图表来源
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L8-L314)
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs#L6-L15)
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs#L6-L19)
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L6-L37)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L10-L12)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L10-L14)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L8-L20)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L8-L24)
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L8-L26)
## 组件详解
### ILogger 接口与日志抽象层
- 设计要点
- 统一日志级别检查与记录方法族,覆盖 Trace/Debug/Info/Warn/Error/Fatal。
- 支持格式化参数与异常附带,避免不必要的字符串拼接开销。
- 通过 Name() 提供命名空间级隔离,便于多模块日志分类。
- 复杂度与性能
- 级别检查为 O(1),格式化在启用时进行,未启用级别直接短路。
- 错误处理
- 对未知级别抛出参数异常,保证上层调用健壮性。
章节来源
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L8-L314)
- [LoggerTests.cs](file://GFramework.Core.Tests/logging/LoggerTests.cs#L10-L421)
### AbstractLogger 抽象基类
- 设计模式
- 模板方法:子类仅需实现 Write其余级别判断、格式化、异常处理由基类完成。
- 关键机制
- 最小级别 minLevelIsEnabled(level) 做前置过滤。
- 核心管道Log(...) 负责格式化与异常包装,最终调用 Write。
- 名称常量 ROOTLoggerName 用于默认日志器标识。
- 性能优化
- 启用检查优先,避免格式化与 IO。
- 参数化日志使用字符串格式化,减少中间字符串对象。
章节来源
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L10-L12)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L49-L127)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L462-L490)
### ConsoleLogger 控制台实现
- 输出格式
- 时间戳:精确到毫秒。
- 级别:大写并右对齐占位,统一宽度。
- 名称:[Name()] 标识来源。
- 异常:换行追加异常文本。
- 彩色输出
- 仅在 writer 指向 Console.Out 且 useColors=true 时启用。
- 不同级别映射不同控制台前景色。
- 可定制性
- 支持自定义 TextWriter 与 useColors。
- 默认最小级别为 Info可通过构造函数调整。
章节来源
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L10-L14)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L25-L38)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L47-L78)
- [ConsoleLoggerTests.cs](file://GFramework.Core.Tests/logging/ConsoleLoggerTests.cs#L17-L278)
### ILoggerFactory 与 ConsoleLoggerFactory
- ILoggerFactory
- 根据名称与最小级别创建 ILogger 实例。
- ConsoleLoggerFactory
- 返回 ConsoleLogger 实例,内部默认最小级别为 Info。
- 使用建议
- 通过工厂按模块/服务创建独立日志器,便于分级与过滤。
章节来源
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs#L6-L15)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L8-L20)
- [LoggerFactoryTests.cs](file://GFramework.Core.Tests/logging/LoggerFactoryTests.cs#L14-L60)
### ILoggerFactoryProvider 与 ConsoleLoggerFactoryProvider
- ILoggerFactoryProvider
- 暴露 MinLevel 属性,用于统一设定最小级别。
- CreateLogger(name) 返回带名称与 MinLevel 的 ILogger。
- ConsoleLoggerFactoryProvider
- 默认 MinLevel=Info委托 ConsoleLoggerFactory.GetLogger(name, minLevel)。
- 多实例支持
- 可创建多个提供程序实例,各自持有独立 MinLevel互不影响已创建实例。
章节来源
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs#L6-L19)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L8-L24)
- [LoggerFactoryTests.cs](file://GFramework.Core.Tests/logging/LoggerFactoryTests.cs#L62-L167)
### LoggerFactoryResolver 工厂解析机制
- 职责
- Provider全局默认工厂提供程序默认 ConsoleLoggerFactoryProvider
- MinLevel全局最小级别默认 Info
- 用法
- 通过 Provider.CreateLogger(name) 获取日志器,自动应用 Provider 的 MinLevel。
- 可动态切换 Provider 与 MinLevel影响后续创建的日志器。
- 多实例支持
- 已创建的日志器维持其构造时的 minLevel不受 Provider.MinLevel 后续变更影响。
章节来源
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L8-L26)
- [LoggerFactoryTests.cs](file://GFramework.Core.Tests/logging/LoggerFactoryTests.cs#L96-L221)
### 日志级别设计与使用场景
- 级别定义
- Trace → Debug → Info → Warning → Error → Fatal数值递增
- 使用建议
- Trace复杂流程追踪、函数调用链。
- Debug开发期变量、分支状态。
- Info关键业务流程、系统状态。
- Warning潜在问题不影响运行。
- Error功能异常可恢复。
- Fatal不可恢复错误。
- 性能与可读性
- 通过最小级别裁剪日志量,避免生产环境噪声。
- 结合命名空间区分模块,提升检索效率。
章节来源
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L6-L37)
- [README.md](file://GFramework.Core/logging/README.md#L289-L299)
## 依赖关系分析
- 抽象依赖
- ILogger 依赖 LogLevelILoggerFactory/Provider 依赖 ILogger。
- 实现依赖
- AbstractLogger 实现 ILogger并依赖 LogLevel。
- ConsoleLogger 继承 AbstractLogger依赖控制台输出与颜色 API。
- ConsoleLoggerFactory/Provider 依赖 ConsoleLogger 与 LogLevel。
- LoggerFactoryResolver 依赖 ConsoleLoggerFactoryProvider 作为默认提供程序。
- 耦合与内聚
- 抽象清晰,实现可替换;工厂与解析器解耦,便于扩展与测试。
```mermaid
graph LR
LogLevel --> ILogger
LogLevel --> ILoggerFactory
LogLevel --> ILoggerFactoryProvider
LogLevel --> AbstractLogger
LogLevel --> ConsoleLogger
ILogger --> AbstractLogger
ILoggerFactory --> ConsoleLoggerFactory
ILoggerFactoryProvider --> ConsoleLoggerFactoryProvider
ConsoleLoggerFactory --> ConsoleLogger
ConsoleLoggerFactoryProvider --> ConsoleLoggerFactory
LoggerFactoryResolver --> ConsoleLoggerFactoryProvider
```
图表来源
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L8-L314)
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs#L6-L15)
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs#L6-L19)
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L6-L37)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L10-L12)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L10-L14)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L8-L20)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L8-L24)
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L8-L26)
## 性能考量
- 级别检查优先:在记录前进行 IsEnabled 判断,避免格式化与 IO。
- 参数化日志:使用格式化方法减少中间字符串对象创建。
- 控制台输出:彩色输出仅在 Console.Out 且启用时生效,避免跨流色彩污染。
- 批量输出:多行日志分行输出,注意外部缓冲区大小与刷新策略。
- 生产建议:将 MinLevel 提升至 Info 或 Warning降低日志写入压力。
章节来源
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L49-L52)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L474-L478)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L47-L78)
- [README.md](file://GFramework.Core/logging/README.md#L342-L355)
## 故障排查指南
- 日志未输出
- 检查最小级别是否高于当前级别;通过 IsEnabledForLevel 验证。
- 确认构造函数传入的 minLevel 是否正确。
- 输出不符合预期
- ConsoleLogger 仅在 writer 为 Console.Out 且 useColors=true 时启用彩色。
- 若传入自定义 TextWriter请确认其是否被正确刷新。
- 多实例行为差异
- Provider.MinLevel 变更不影响已创建实例;如需一致行为,重新创建实例。
- 异常信息未显示
- 确保调用带 Exception 的重载方法;异常会在单独行追加。
章节来源
- [LoggerTests.cs](file://GFramework.Core.Tests/logging/LoggerTests.cs#L10-L421)
- [ConsoleLoggerTests.cs](file://GFramework.Core.Tests/logging/ConsoleLoggerTests.cs#L17-L278)
- [LoggerFactoryTests.cs](file://GFramework.Core.Tests/logging/LoggerFactoryTests.cs#L96-L257)
## 结论
GFramework 日志系统以清晰的抽象层与工厂解析机制为核心,既满足控制台开发的即时可观测性,又为多平台输出与多实例管理奠定基础。通过合理的日志级别与命名策略,结合参数化日志与最小级别裁剪,可在性能与可观测性之间取得平衡。
## 附录
### API 一览(核心)
- ILogger
- 级别检查IsTraceEnabled/IsDebugEnabled/IsInfoEnabled/IsWarnEnabled/IsErrorEnabled/IsFatalEnabled/IsEnabledForLevel
- 记录方法Trace/Debug/Info/Warn/Error/Fatal支持格式化与异常
- 元数据Name()
- ILoggerFactoryGetLogger(name, minLevel)
- ILoggerFactoryProviderMinLevel + CreateLogger(name)
- LogLevelTrace/Debug/Info/Warning/Error/Fatal
- AbstractLogger模板方法 Write(level, message, exception)
- ConsoleLogger控制台输出 + 彩色打印 + 可定制 TextWriter/useColors
- LoggerFactoryResolverProvider默认 ConsoleLoggerFactoryProvider+ MinLevel默认 Info
章节来源
- [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L8-L314)
- [ILoggerFactory.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactory.cs#L6-L15)
- [ILoggerFactoryProvider.cs](file://GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs#L6-L19)
- [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L6-L37)
- [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L10-L12)
- [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L10-L14)
- [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L8-L20)
- [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L8-L24)
- [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L8-L26)
### 最佳实践
- 合理选择日志级别Info 记录主业务Debug 记录开发期细节Warning/Error/Fatal 分级告警。
- 提供上下文:在消息中包含关键上下文(如用户 ID、任务 ID便于检索。
- 异常记录:统一使用带 Exception 的重载,保留堆栈信息。
- 分类日志:按模块/服务创建独立日志器,使用名称区分来源。
- 性能监控:在关键路径埋点,结合日志与指标,形成闭环观测。
章节来源
- [README.md](file://GFramework.Core/logging/README.md#L300-L341)