diff --git a/GFramework.Core/logging/ILog.cs b/GFramework.Core/logging/ILog.cs new file mode 100644 index 0000000..0afc49d --- /dev/null +++ b/GFramework.Core/logging/ILog.cs @@ -0,0 +1,28 @@ +namespace GFramework.Core.logging; + +/// +/// 定义日志记录接口,提供日志记录和级别检查功能 +/// +public interface ILog +{ + /// + /// 记录指定级别的日志消息 + /// + /// 日志级别 + /// 日志消息内容 + /// 可选的异常对象,默认为null + /// 可选的上下文对象,默认为null + void Log( + LogLevel level, + string message, + Exception? exception = null, + object? context = null + ); + + /// + /// 检查指定日志级别是否已启用 + /// + /// 要检查的日志级别 + /// 如果指定级别已启用则返回true,否则返回false + bool IsEnabled(LogLevel level); +} diff --git a/GFramework.Core/logging/ILoggerFactory.cs b/GFramework.Core/logging/ILoggerFactory.cs new file mode 100644 index 0000000..2de452e --- /dev/null +++ b/GFramework.Core/logging/ILoggerFactory.cs @@ -0,0 +1,15 @@ +namespace GFramework.Core.logging; + +/// +/// 定义日志工厂接口,用于创建日志记录器实例 +/// +public interface ILoggerFactory +{ + /// + /// 创建指定类别的日志记录器实例 + /// + /// 日志类别,用于区分不同的日志源 + /// 返回指定类别的日志记录器实例 + ILog Create(string category); +} + diff --git a/GFramework.Core/logging/Log.cs b/GFramework.Core/logging/Log.cs new file mode 100644 index 0000000..0488bab --- /dev/null +++ b/GFramework.Core/logging/Log.cs @@ -0,0 +1,78 @@ +namespace GFramework.Core.logging; + +/// +/// 日志记录的静态类,提供全局日志记录功能 +/// +public static class Log +{ + /// + /// 获取或设置当前的日志记录器实例 + /// 默认使用 NullLogger,不输出任何日志 + /// + public static ILog Instance { get; private set; } = new NullLogger(); + + /// + /// 设置日志记录器实例 + /// + /// 要设置的日志记录器,如果为 null 则使用 NullLogger + public static void SetLogger(ILog? logger) + { + Instance = logger ?? new NullLogger(); + } + + /// + /// 检查指定日志级别是否启用 + /// + /// 要检查的日志级别 + /// 如果指定级别已启用则返回 true,否则返回 false + public static bool IsEnabled(LogLevel level) => Instance.IsEnabled(level); + + /// + /// 记录信息级别日志 + /// + /// 日志消息 + /// 日志上下文信息(可选) + public static void Info(string msg, object? ctx = null) + => Instance.Log(LogLevel.Info, msg, null, ctx); + + /// + /// 记录错误级别日志 + /// + /// 日志消息 + /// 相关异常对象(可选) + /// 日志上下文信息(可选) + public static void Error(string msg, Exception? ex = null, object? ctx = null) + => Instance.Log(LogLevel.Error, msg, ex, ctx); + + /// + /// 记录调试级别日志 + /// + /// 日志消息 + /// 日志上下文信息(可选) + public static void Debug(string msg, object? ctx = null) + => Instance.Log(LogLevel.Debug, msg, null, ctx); + + /// + /// 记录跟踪级别日志 + /// + /// 日志消息 + /// 日志上下文信息(可选) + public static void Trace(string msg, object? ctx = null) + => Instance.Log(LogLevel.Trace, msg, null, ctx); + + /// + /// 记录警告级别日志 + /// + /// 日志消息 + /// 日志上下文信息(可选) + public static void Warn(string msg, object? ctx = null) + => Instance.Log(LogLevel.Warning, msg, null, ctx); + + /// + /// 记录致命错误级别日志 + /// + /// 日志消息 + /// 日志上下文信息(可选) + public static void Fatal(string msg, object? ctx = null) + => Instance.Log(LogLevel.Fatal, msg, null, ctx); +} diff --git a/GFramework.Core/logging/LogLevel.cs b/GFramework.Core/logging/LogLevel.cs new file mode 100644 index 0000000..a9469a6 --- /dev/null +++ b/GFramework.Core/logging/LogLevel.cs @@ -0,0 +1,32 @@ +namespace GFramework.Core.logging; + +/// +/// 定义日志级别的枚举,用于标识不同严重程度的日志消息 +/// +public enum LogLevel +{ + /// + /// 跟踪级别,用于详细的程序执行流程信息 + /// + Trace, + /// + /// 调试级别,用于调试过程中的详细信息 + /// + Debug, + /// + /// 信息级别,用于一般性的程序运行信息 + /// + Info, + /// + /// 警告级别,用于表示可能的问题或异常情况 + /// + Warning, + /// + /// 错误级别,用于表示错误但程序仍可继续运行的情况 + /// + Error, + /// + /// 致命级别,用于表示严重的错误导致程序无法继续运行 + /// + Fatal +} diff --git a/GFramework.Core/logging/NullLogger.cs b/GFramework.Core/logging/NullLogger.cs new file mode 100644 index 0000000..08e33d7 --- /dev/null +++ b/GFramework.Core/logging/NullLogger.cs @@ -0,0 +1,24 @@ +namespace GFramework.Core.logging; + +/// +/// 空日志记录器实现,用于禁用日志记录功能 +/// +internal sealed class NullLogger : ILog +{ + /// + /// 记录日志消息(空实现,不执行任何操作) + /// + /// 日志级别 + /// 日志消息 + /// 相关异常对象(可选) + /// 日志上下文信息(可选) + public void Log(LogLevel level, string message, Exception? exception, object? context) { } + + /// + /// 检查指定日志级别是否启用 + /// + /// 要检查的日志级别 + /// 始终返回 false,表示所有日志级别都被禁用 + public bool IsEnabled(LogLevel level) => false; +} + diff --git a/GFramework.Godot/logging/GodotLogger.cs b/GFramework.Godot/logging/GodotLogger.cs new file mode 100644 index 0000000..6c0503b --- /dev/null +++ b/GFramework.Godot/logging/GodotLogger.cs @@ -0,0 +1,49 @@ +using GFramework.Core.logging; +using Godot; + +namespace GFramework.Godot.logging; + +/// +/// Godot平台的日志记录器实现 +/// +public sealed class GodotLogger : ILog +{ + /// + /// 记录日志消息到Godot控制台 + /// + /// 日志级别 + /// 日志消息 + /// 关联的异常对象 + /// 日志上下文 + 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; + } + } + + /// + /// 检查指定日志级别是否启用 + /// + /// 日志级别 + /// 始终返回 true + public bool IsEnabled(LogLevel level) => true; +}