feat(logging): 添加日志记录系统的基础实现

- 定义了ILog接口,提供日志记录和级别检查功能
- 实现了GodotLogger类,将日志输出到Godot控制台
- 创建了ILoggerFactory接口用于创建日志记录器实例
- 添加了Log静态类提供全局日志记录功能
- 定义了LogLevel枚举标识不同严重程度的日志级别
- 实现了NullLogger用于禁用日志记录功能
This commit is contained in:
GeWuYou 2025-12-23 12:52:07 +08:00
parent be71076efc
commit fdaac135f9
6 changed files with 226 additions and 0 deletions

View File

@ -0,0 +1,28 @@
namespace GFramework.Core.logging;
/// <summary>
/// 定义日志记录接口,提供日志记录和级别检查功能
/// </summary>
public interface ILog
{
/// <summary>
/// 记录指定级别的日志消息
/// </summary>
/// <param name="level">日志级别</param>
/// <param name="message">日志消息内容</param>
/// <param name="exception">可选的异常对象默认为null</param>
/// <param name="context">可选的上下文对象默认为null</param>
void Log(
LogLevel level,
string message,
Exception? exception = null,
object? context = null
);
/// <summary>
/// 检查指定日志级别是否已启用
/// </summary>
/// <param name="level">要检查的日志级别</param>
/// <returns>如果指定级别已启用则返回true否则返回false</returns>
bool IsEnabled(LogLevel level);
}

View File

@ -0,0 +1,15 @@
namespace GFramework.Core.logging;
/// <summary>
/// 定义日志工厂接口,用于创建日志记录器实例
/// </summary>
public interface ILoggerFactory
{
/// <summary>
/// 创建指定类别的日志记录器实例
/// </summary>
/// <param name="category">日志类别,用于区分不同的日志源</param>
/// <returns>返回指定类别的日志记录器实例</returns>
ILog Create(string category);
}

View File

@ -0,0 +1,78 @@
namespace GFramework.Core.logging;
/// <summary>
/// 日志记录的静态类,提供全局日志记录功能
/// </summary>
public static class Log
{
/// <summary>
/// 获取或设置当前的日志记录器实例
/// 默认使用 NullLogger不输出任何日志
/// </summary>
public static ILog Instance { get; private set; } = new NullLogger();
/// <summary>
/// 设置日志记录器实例
/// </summary>
/// <param name="logger">要设置的日志记录器,如果为 null 则使用 NullLogger</param>
public static void SetLogger(ILog? logger)
{
Instance = logger ?? new NullLogger();
}
/// <summary>
/// 检查指定日志级别是否启用
/// </summary>
/// <param name="level">要检查的日志级别</param>
/// <returns>如果指定级别已启用则返回 true否则返回 false</returns>
public static bool IsEnabled(LogLevel level) => Instance.IsEnabled(level);
/// <summary>
/// 记录信息级别日志
/// </summary>
/// <param name="msg">日志消息</param>
/// <param name="ctx">日志上下文信息(可选)</param>
public static void Info(string msg, object? ctx = null)
=> Instance.Log(LogLevel.Info, msg, null, ctx);
/// <summary>
/// 记录错误级别日志
/// </summary>
/// <param name="msg">日志消息</param>
/// <param name="ex">相关异常对象(可选)</param>
/// <param name="ctx">日志上下文信息(可选)</param>
public static void Error(string msg, Exception? ex = null, object? ctx = null)
=> Instance.Log(LogLevel.Error, msg, ex, ctx);
/// <summary>
/// 记录调试级别日志
/// </summary>
/// <param name="msg">日志消息</param>
/// <param name="ctx">日志上下文信息(可选)</param>
public static void Debug(string msg, object? ctx = null)
=> Instance.Log(LogLevel.Debug, msg, null, ctx);
/// <summary>
/// 记录跟踪级别日志
/// </summary>
/// <param name="msg">日志消息</param>
/// <param name="ctx">日志上下文信息(可选)</param>
public static void Trace(string msg, object? ctx = null)
=> Instance.Log(LogLevel.Trace, msg, null, ctx);
/// <summary>
/// 记录警告级别日志
/// </summary>
/// <param name="msg">日志消息</param>
/// <param name="ctx">日志上下文信息(可选)</param>
public static void Warn(string msg, object? ctx = null)
=> Instance.Log(LogLevel.Warning, msg, null, ctx);
/// <summary>
/// 记录致命错误级别日志
/// </summary>
/// <param name="msg">日志消息</param>
/// <param name="ctx">日志上下文信息(可选)</param>
public static void Fatal(string msg, object? ctx = null)
=> Instance.Log(LogLevel.Fatal, msg, null, ctx);
}

View File

@ -0,0 +1,32 @@
namespace GFramework.Core.logging;
/// <summary>
/// 定义日志级别的枚举,用于标识不同严重程度的日志消息
/// </summary>
public enum LogLevel
{
/// <summary>
/// 跟踪级别,用于详细的程序执行流程信息
/// </summary>
Trace,
/// <summary>
/// 调试级别,用于调试过程中的详细信息
/// </summary>
Debug,
/// <summary>
/// 信息级别,用于一般性的程序运行信息
/// </summary>
Info,
/// <summary>
/// 警告级别,用于表示可能的问题或异常情况
/// </summary>
Warning,
/// <summary>
/// 错误级别,用于表示错误但程序仍可继续运行的情况
/// </summary>
Error,
/// <summary>
/// 致命级别,用于表示严重的错误导致程序无法继续运行
/// </summary>
Fatal
}

View File

@ -0,0 +1,24 @@
namespace GFramework.Core.logging;
/// <summary>
/// 空日志记录器实现,用于禁用日志记录功能
/// </summary>
internal sealed class NullLogger : ILog
{
/// <summary>
/// 记录日志消息(空实现,不执行任何操作)
/// </summary>
/// <param name="level">日志级别</param>
/// <param name="message">日志消息</param>
/// <param name="exception">相关异常对象(可选)</param>
/// <param name="context">日志上下文信息(可选)</param>
public void Log(LogLevel level, string message, Exception? exception, object? context) { }
/// <summary>
/// 检查指定日志级别是否启用
/// </summary>
/// <param name="level">要检查的日志级别</param>
/// <returns>始终返回 false表示所有日志级别都被禁用</returns>
public bool IsEnabled(LogLevel level) => false;
}

View File

@ -0,0 +1,49 @@
using GFramework.Core.logging;
using Godot;
namespace GFramework.Godot.logging;
/// <summary>
/// Godot平台的日志记录器实现
/// </summary>
public sealed class GodotLogger : ILog
{
/// <summary>
/// 记录日志消息到Godot控制台
/// </summary>
/// <param name="level">日志级别</param>
/// <param name="message">日志消息</param>
/// <param name="exception">关联的异常对象</param>
/// <param name="context">日志上下文</param>
public void Log(LogLevel level, string message, Exception? exception, object? context)
{
var prefix = $"[{level}]";
if (exception != null)
message += $"\n{exception}";
switch (level)
{
case LogLevel.Error:
case LogLevel.Fatal:
GD.PrintErr(prefix, message);
break;
case LogLevel.Warning:
GD.PushWarning($"{prefix} {message}");
break;
case LogLevel.Trace:
case LogLevel.Debug:
case LogLevel.Info:
default:
GD.Print(prefix, message);
break;
}
}
/// <summary>
/// 检查指定日志级别是否启用
/// </summary>
/// <param name="level">日志级别</param>
/// <returns>始终返回 true</returns>
public bool IsEnabled(LogLevel level) => true;
}