# 错误处理与调试 **本文引用的文件** - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs) - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs) - [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs) - [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs) - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md) - [README.md(日志包)](file://GFramework.Core/logging/README.md) - [core-api.md](file://docs/api-reference/core-api.md) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向GFramework使用者与维护者,系统化地总结错误处理与调试的最佳实践,覆盖异常类型设计、异常信息记录、异常恢复策略;日志规范(级别、结构化、性能);调试技巧(断点、条件断点、性能分析);以及错误监控与告警(统计、上报、恢复)。内容既包含代码级实现细节,也提供可直接落地的操作建议。 ## 项目结构 围绕“错误处理与调试”,本仓库的关键位置如下: - 日志基础设施:抽象日志器、控制台日志器、工厂与解析器 - 系统基类:在系统生命周期中注入日志能力 - 文档与范式:异常处理策略、错误恢复、事件总线容错、API参考中的异常类型 ```mermaid graph TB subgraph "日志子系统" IF["ILogger 接口"] AL["AbstractLogger 抽象类"] CL["ConsoleLogger 控制台实现"] LF["ConsoleLoggerFactory 工厂"] LFP["ConsoleLoggerFactoryProvider 提供程序"] LFR["LoggerFactoryResolver 解析器"] LL["LogLevel 枚举"] end subgraph "系统与文档" AS["AbstractSystem 系统基类"] DOC1["architecture-patterns.md
异常与恢复策略"] DOC2["README.md日志包
日志最佳实践"] DOC3["core-api.md
异常类型参考"] DOC4["advanced-patterns.md
事件总线容错"] end IF --> AL AL --> CL LF --> CL LFP --> LF LFR --> LFP LL --> AL LL --> CL AS --> LFR AS --> IF DOC1 --> AS DOC2 --> AL DOC3 --> AS DOC4 --> AS ``` **图示来源** - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314) - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [LoggerFactoryResolver.cs](file://GFramework.Core/logging/LoggerFactoryResolver.cs#L1-L26) - [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L1-L37) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L833-L1036) - [README.md(日志包)](file://GFramework.Core/logging/README.md#L1-L364) - [core-api.md](file://docs/api-reference/core-api.md#L1058-L1092) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L692-L882) **章节来源** - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314) - [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L1-L37) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core.logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L833-L1036) - [README.md(日志包)](file://GFramework.Core/logging/README.md#L1-L364) - [core-api.md](file://docs/api-reference/core-api.md#L1058-L1092) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L692-L882) ## 核心组件 - 日志接口与抽象:ILogger定义全量日志方法与级别检查;AbstractLogger统一实现级别判断、格式化与异常透传,并要求子类实现Write。 - 控制台日志器:ConsoleLogger实现Write,按时间戳、级别、名称、消息与异常输出,支持彩色输出。 - 工厂与解析器:ConsoleLoggerFactory创建ConsoleLogger;ConsoleLoggerFactoryProvider提供最小级别;LoggerFactoryResolver集中管理Provider与MinLevel。 - 系统基类:AbstractSystem在Init/Destroy中创建并记录系统日志,体现“在生命周期关键节点打点”的最佳实践。 **章节来源** - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314) - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) ## 架构概览 下图展示日志子系统的类关系与交互,映射到实际代码文件: ```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 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 ILoggerFactory { +GetLogger(name, minLevel) ILogger } class ConsoleLoggerFactory { +GetLogger(name, minLevel) ILogger } class ILoggerFactoryProvider { +CreateLogger(name) ILogger } class ConsoleLoggerFactoryProvider { +MinLevel LogLevel +CreateLogger(name) ILogger } class LoggerFactoryResolver { +Provider ILoggerFactoryProvider +MinLevel LogLevel } class LogLevel { <> +Trace +Debug +Info +Warning +Error +Fatal } ILogger <|.. AbstractLogger AbstractLogger <|-- ConsoleLogger ILoggerFactory <|.. ConsoleLoggerFactory ILoggerFactoryProvider <|.. ConsoleLoggerFactoryProvider LoggerFactoryResolver --> ConsoleLoggerFactoryProvider : "持有" ConsoleLoggerFactory --> ConsoleLogger : "创建" ConsoleLogger --> LogLevel : "使用" AbstractLogger --> LogLevel : "使用" ``` **图示来源** - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314) - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core/logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L1-L37) ## 详细组件分析 ### 日志系统与最佳实践 - 级别与格式:AbstractLogger封装级别检查与格式化;ConsoleLogger输出包含时间戳、级别、名称与异常堆栈;LoggerFactoryResolver集中配置最小级别。 - 结构化与上下文:README.md建议在Info中附加键值对上下文;在系统/模块初始化/销毁处记录关键事件。 - 性能与开销:ILogger接口在各重载中注明“禁用时避免不必要的对象创建/字符串拼接”,AbstractLogger在Log前先做IsEnabled判断,减少无效格式化与IO。 ```mermaid sequenceDiagram participant S as "AbstractSystem" participant R as "LoggerFactoryResolver" participant P as "ConsoleLoggerFactoryProvider" participant F as "ConsoleLoggerFactory" participant L as "ConsoleLogger" S->>R : 读取Provider与MinLevel R-->>S : 返回Provider S->>P : CreateLogger(系统名) P-->>S : 返回ILoggerFactory S->>F : GetLogger(系统名, MinLevel) F-->>S : 返回ConsoleLogger S->>L : Debug/Info 记录生命周期事件 ``` **图示来源** - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core.logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) **章节来源** - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [README.md(日志包)](file://GFramework.Core/logging/README.md#L1-L364) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) ### 异常处理与恢复策略 - 分层异常:文档给出“应用异常—业务异常—具体异常”的层次化设计,便于在上层统一包装与降级。 - 恢复策略:以存档加载为例,优先主存储,失败后回退到备份存储,并在成功后同步回主存储;最终返回默认数据作为兜底。 - 事件总线容错:发布异步事件时,逐个处理器捕获异常并记录,避免单个处理器失败影响整体流程。 ```mermaid flowchart TD Start(["开始"]) --> TryPrimary["尝试从主存储加载"] TryPrimary --> PrimaryOK{"主存储加载成功?"} PrimaryOK --> |是| ReturnPrimary["返回主存储数据"] PrimaryOK --> |否| LogWarn["记录警告日志"] LogWarn --> TryBackup["尝试从备份存储加载"] TryBackup --> BackupOK{"备份存储加载成功?"} BackupOK --> |是| SyncBack["同步到主存储"] SyncBack --> ReturnBackup["返回备份数据"] BackupOK --> |否| LogErr["记录错误日志"] LogErr --> ReturnDefault["返回默认存档数据"] ReturnPrimary --> End(["结束"]) ReturnBackup --> End ReturnDefault --> End ``` **图示来源** - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L960-L1018) **章节来源** - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L833-L1036) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L692-L882) ### 日志级别与使用规范 - 级别定义:Trace/Debug/Info/Warning/Error/Fatal六级,分别用于跟踪、调试、信息、警告、错误、致命。 - 使用建议:Info记录关键业务流程;Debug记录变量与分支;Warning记录潜在问题;Error记录影响功能但可恢复的问题;Fatal记录不可恢复的严重错误。 - 结构化记录:在Info中附加上下文键值对;异常记录时附带Exception对象,便于定位。 **章节来源** - [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L1-L37) - [README.md(日志包)](file://GFramework.Core/logging/README.md#L289-L341) ### 系统生命周期中的日志打点 - AbstractSystem在Init/Destroy中创建Logger并记录“初始化/销毁开始/完成”事件,形成清晰的可观测性轨迹。 - 建议在OnInit/OnDestroy中补充更多关键步骤日志,配合IsInfoEnabled/IsDebugEnabled进行条件输出。 **章节来源** - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) ## 依赖关系分析 - 组件耦合:AbstractLogger对LogLevel强依赖;ConsoleLogger依赖AbstractLogger;LoggerFactoryResolver依赖ConsoleLoggerFactoryProvider;AbstractSystem依赖LoggerFactoryResolver。 - 外部依赖:日志系统未引入第三方库,保持轻量;通过ILoggerFactoryProvider实现可替换性,利于扩展至文件/网络/Unity等平台。 ```mermaid graph LR LL["LogLevel"] --> AL["AbstractLogger"] AL --> CL["ConsoleLogger"] LFP["ConsoleLoggerFactoryProvider"] --> LF["ConsoleLoggerFactory"] LF --> CL LFR["LoggerFactoryResolver"] --> LFP AS["AbstractSystem"] --> LFR AS --> IF["ILogger"] ``` **图示来源** - [LogLevel.cs](file://GFramework.Core.Abstractions/logging/LogLevel.cs#L1-L37) - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core.logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) **章节来源** - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314) - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core.logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) ## 性能考量 - 级别检查前置:ILogger接口与AbstractLogger均在记录前进行IsEnabled判断,避免不必要的格式化与IO。 - 条件日志:在高并发/高频路径中,优先使用IsInfoEnabled/IsDebugEnabled等检查,再决定是否构造复杂消息。 - 输出设备:ConsoleLogger在非控制台输出时自动关闭彩色输出,减少终端转义字符带来的开销。 - 事件总线:发布异步事件时逐个处理器捕获异常并记录,避免阻塞其他处理器,提升吞吐。 **章节来源** - [ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314) - [AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L756-L794) ## 故障排查指南 - 异常类型选择 - 基础异常:GFrameworkException作为框架异常基类;ArchitectureException、ComponentException用于架构与组件层面的异常。 - 业务异常:参考“分层异常”文档,将底层异常包装为业务异常,携带ErrorCode与Context,便于上层统一处理与监控。 - 异常信息记录 - 在关键路径捕获异常后,使用Error/Fatal记录消息与Exception对象;在Info中附加上下文键值对,如用户ID、请求参数等。 - 对于事件总线中的处理器异常,采用“记录并继续”的策略,避免影响其他处理器。 - 恢复策略 - 存档加载:主存储失败回退备份存储,成功后同步回主存储;最终返回默认数据兜底。 - 系统初始化:在AbstractSystem中记录“开始/完成”事件,便于定位初始化失败阶段。 - 常见问题定位 - 日志级别过低:检查LoggerFactoryResolver.MinLevel与ConsoleLoggerFactoryProvider.MinLevel,必要时提升为Debug/Trace。 - 输出设备问题:ConsoleLogger在非Console.Out时会禁用彩色输出,确认writer参数与目标输出环境。 - 性能瓶颈:在高频路径使用IsEnabled检查;避免在循环中进行昂贵的字符串拼接;必要时将日志级别提升到Warning/Error以降低Info开销。 **章节来源** - [core-api.md](file://docs/api-reference/core-api.md#L1058-L1092) - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L833-L1036) - [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L756-L794) - [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) - [LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - [ConsoleLoggerFactoryProvider.cs](file://GFramework.Core.logging/ConsoleLoggerFactoryProvider.cs#L1-L24) - [ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81) ## 结论 GFramework的日志与异常体系以ILogger为核心,通过AbstractLogger统一实现级别检查与格式化,结合ConsoleLogger提供开箱即用的控制台输出;LoggerFactoryResolver集中管理Provider与最小级别,使日志策略可配置、可替换。在异常处理方面,文档提供了分层异常与优雅恢复的范式;在调试方面,建议结合断点、条件断点与性能分析工具,配合日志与事件总线容错,构建完善的可观测性与韧性系统。 ## 附录 - 关键实现路径 - 日志接口与抽象:[ILogger.cs](file://GFramework.Core.Abstractions/logging/ILogger.cs#L1-L314)、[AbstractLogger.cs](file://GFramework.Core/logging/AbstractLogger.cs#L1-L493) - 控制台实现与工厂:[ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs#L1-L81)、[ConsoleLoggerFactory.cs](file://GFramework.Core/logging/ConsoleLoggerFactory.cs#L1-L20) - 工厂提供程序与解析器:[ConsoleLoggerFactoryProvider.cs](file://GFramework.Core.logging/ConsoleLoggerFactoryProvider.cs#L1-L24)、[LoggerFactoryResolver.cs](file://GFramework.Core.logging/LoggerFactoryResolver.cs#L1-L26) - 系统生命周期打点:[AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62) - 异常与恢复策略:[architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L833-L1036) - 事件总线容错:[advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L756-L794) - API参考(异常类型):[core-api.md](file://docs/api-reference/core-api.md#L1058-L1092) - 日志包使用说明与最佳实践:[README.md(日志包)](file://GFramework.Core/logging/README.md#L1-L364)