GFramework/docs/zh-CN/source-generators/logging-generator.md
GeWuYou 1ab615db26 docs(source-generators): 更新文档结构并调整Godot版本信息
- 将Source Generators概述文档从overview重命名为index
- 更新所有相关文档中的链接指向新的index文件
- 移除Godot文档中的许可证和版本信息冗余内容
- 统一Godot版本要求从4.5.1+到4.6
- 删除各模块文档末尾的相关链接部分
- 优化文档结构提升可读性
2026-02-11 15:57:40 +08:00

2.8 KiB
Raw Blame History

日志生成器

GFramework.SourceGenerators 自动生成日志代码,减少样板代码

概述

日志生成器是一个 Source Generator它会自动为标记了 [Log] 特性的类生成 Logger 字段和日志方法调用。这消除了手动编写日志代码的需要,让开发者专注于业务逻辑。

基本用法

标记类

using GFramework.SourceGenerators.Attributes;

[Log]
public partial class MyService
{
    public void DoSomething()
    {
        // 自动生成 Logger 字段
        // 自动生成日志调用
        Logger.Info("执行操作");
    }
}

生成代码

上面的代码会被编译时转换为:

public partial class MyService
{
    // 自动生成的字段
    [CompilerGenerated]
    private ILogger _logger;

    // 自动生成的属性
    [CompilerGenerated]
    public ILogger Logger
    {
        get
        {
            if (_logger == null)
            {
                _logger = LoggerFactory.CreateLogger<MyService>();
            }
            return _logger;
        }
    }
}

日志级别

生成的日志方法支持多种级别:

[Log]
public partial class MyClass
{
    public void Example()
    {
        // 调试信息
        Logger.Debug($"调试信息: {value}");

        // 普通信息
        Logger.Info("操作成功");

        // 警告
        Logger.Warning($"警告: {message}");

        // 错误
        Logger.Error($"错误: {ex.Message}");

        // 严重错误
        Logger.Critical("系统故障");
    }
}

自定义日志类别

[Log(LogCategory.Gameplay)]
public partial class GameplaySystem
{
    // 日志会标记为 Gameplay 类别
    public void Update()
    {
        Logger.Info("游戏逻辑更新");
    }
}

与其他模块集成

与 Godot 集成

[Log]
[ContextAware]
public partial class GodotController : Node
{
    public override void _Ready()
    {
        Logger.Info("控制器已准备就绪");
    }
}

与架构集成

[Log]
public partial class MySystem : AbstractSystem
{
    protected override void OnInit()
    {
        Logger.Info("系统初始化");
    }
}

配置选项

禁用自动生成

// 禁用自动日志调用生成
[Log(AutoLog = false)]
public partial class MyClass
{
    // 仍会生成 Logger 字段,但不会自动生成日志调用
    public void DoSomething()
    {
        // 需要手动调用 Logger
        Logger.Info("手动日志");
    }
}

自定义字段名称

[Log(FieldName = "_customLogger")]
public partial class MyClass
{
    // Logger 字段名称为 _customLogger
}

相关文档