diff --git a/GFramework.Core/logging/AbstractLogger.cs b/GFramework.Core/logging/AbstractLogger.cs new file mode 100644 index 0000000..336610d --- /dev/null +++ b/GFramework.Core/logging/AbstractLogger.cs @@ -0,0 +1,350 @@ +namespace GFramework.Core.logging; + +/// +/// 日志抽象基类,封装日志级别判断、格式化与异常处理逻辑。 +/// 平台日志器只需实现 Write 方法即可。 +/// +public abstract class AbstractLogger( + string? name = null, + LogLevel minLevel = LogLevel.Info) : ILogger +{ + private readonly string _name = name ?? ILogger.RootLoggerName; + + #region Metadata + + /// + /// 获取日志器的名称 + /// + /// 日志器名称 + public string Name() => _name; + + #endregion + + #region Level Checks + + /// + /// 判断指定日志级别是否启用 + /// + /// 要检查的日志级别 + /// 如果指定级别大于等于最小级别则返回true,否则返回false + protected bool IsEnabled(LogLevel level) => level >= minLevel; + + /// + /// 检查Trace级别日志是否启用 + /// + /// 如果Trace级别启用返回true,否则返回false + public bool IsTraceEnabled() => IsEnabled(LogLevel.Trace); + + /// + /// 检查Debug级别日志是否启用 + /// + /// 如果Debug级别启用返回true,否则返回false + public bool IsDebugEnabled() => IsEnabled(LogLevel.Debug); + + /// + /// 检查Info级别日志是否启用 + /// + /// 如果Info级别启用返回true,否则返回false + public bool IsInfoEnabled() => IsEnabled(LogLevel.Info); + + /// + /// 检查Warning级别日志是否启用 + /// + /// 如果Warning级别启用返回true,否则返回false + public bool IsWarnEnabled() => IsEnabled(LogLevel.Warning); + + /// + /// 检查Error级别日志是否启用 + /// + /// 如果Error级别启用返回true,否则返回false + public bool IsErrorEnabled() => IsEnabled(LogLevel.Error); + + /// + /// 检查Fatal级别日志是否启用 + /// + /// 如果Fatal级别启用返回true,否则返回false + public bool IsFatalEnabled() => IsEnabled(LogLevel.Fatal); + + #endregion + + #region Trace + + /// + /// 记录Trace级别日志 + /// + /// 日志消息 + public void Trace(string msg) => Log(LogLevel.Trace, msg); + + /// + /// 记录Trace级别日志(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Trace(string format, object arg) => Log(LogLevel.Trace, format, arg); + + /// + /// 记录Trace级别日志(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Trace(string format, object arg1, object arg2) => Log(LogLevel.Trace, format, arg1, arg2); + + /// + /// 记录Trace级别日志(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Trace(string format, params object[] arguments) => Log(LogLevel.Trace, format, arguments); + + /// + /// 记录Trace级别日志(带异常信息) + /// + /// 日志消息 + /// 异常对象 + public void Trace(string msg, Exception t) => Log(LogLevel.Trace, msg, t); + + #endregion + + #region Debug + + /// + /// 记录Debug级别日志 + /// + /// 日志消息 + public void Debug(string msg) => Log(LogLevel.Debug, msg); + + /// + /// 记录Debug级别日志(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Debug(string format, object arg) => Log(LogLevel.Debug, format, arg); + + /// + /// 记录Debug级别日志(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Debug(string format, object arg1, object arg2) => Log(LogLevel.Debug, format, arg1, arg2); + + /// + /// 记录Debug级别日志(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Debug(string format, params object[] arguments) => Log(LogLevel.Debug, format, arguments); + + /// + /// 记录Debug级别日志(带异常信息) + /// + /// 日志消息 + /// 异常对象 + public void Debug(string msg, Exception t) => Log(LogLevel.Debug, msg, t); + + #endregion + + #region Info + + /// + /// 记录Info级别日志 + /// + /// 日志消息 + public void Info(string msg) => Log(LogLevel.Info, msg); + + /// + /// 记录Info级别日志(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Info(string format, object arg) => Log(LogLevel.Info, format, arg); + + /// + /// 记录Info级别日志(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Info(string format, object arg1, object arg2) => Log(LogLevel.Info, format, arg1, arg2); + + /// + /// 记录Info级别日志(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Info(string format, params object[] arguments) => Log(LogLevel.Info, format, arguments); + + /// + /// 记录Info级别日志(带异常信息) + /// + /// 日志消息 + /// 异常对象 + public void Info(string msg, Exception t) => Log(LogLevel.Info, msg, t); + + #endregion + + #region Warn + + /// + /// 记录Warning级别日志 + /// + /// 日志消息 + public void Warn(string msg) => Log(LogLevel.Warning, msg); + + /// + /// 记录Warning级别日志(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Warn(string format, object arg) => Log(LogLevel.Warning, format, arg); + + /// + /// 记录Warning级别日志(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Warn(string format, object arg1, object arg2) => Log(LogLevel.Warning, format, arg1, arg2); + + /// + /// 记录Warning级别日志(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Warn(string format, params object[] arguments) => Log(LogLevel.Warning, format, arguments); + + /// + /// 记录Warning级别日志(带异常信息) + /// + /// 日志消息 + /// 异常对象 + public void Warn(string msg, Exception t) => Log(LogLevel.Warning, msg, t); + + #endregion + + #region Error + + /// + /// 记录Error级别日志 + /// + /// 日志消息 + public void Error(string msg) => Log(LogLevel.Error, msg); + + /// + /// 记录Error级别日志(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Error(string format, object arg) => Log(LogLevel.Error, format, arg); + + /// + /// 记录Error级别日志(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Error(string format, object arg1, object arg2) => Log(LogLevel.Error, format, arg1, arg2); + + /// + /// 记录Error级别日志(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Error(string format, params object[] arguments) => Log(LogLevel.Error, format, arguments); + + /// + /// 记录Error级别日志(带异常信息) + /// + /// 日志消息 + /// 异常对象 + public void Error(string msg, Exception t) => Log(LogLevel.Error, msg, t); + + #endregion + + #region Fatal + + /// + /// 记录Fatal级别日志 + /// + /// 日志消息 + public void Fatal(string msg) => Log(LogLevel.Fatal, msg); + + /// + /// 记录Fatal级别日志(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Fatal(string format, object arg) => Log(LogLevel.Fatal, format, arg); + + /// + /// 记录Fatal级别日志(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Fatal(string format, object arg1, object arg2) => Log(LogLevel.Fatal, format, arg1, arg2); + + /// + /// 记录Fatal级别日志(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Fatal(string format, params object[] arguments) => Log(LogLevel.Fatal, format, arguments); + + /// + /// 记录Fatal级别日志(带异常信息) + /// + /// 日志消息 + /// 异常对象 + public void Fatal(string msg, Exception t) => Log(LogLevel.Fatal, msg, t); + + #endregion + + #region Core Pipeline + + /// + /// 核心日志记录方法(无参数) + /// + /// 日志级别 + /// 日志消息 + private void Log(LogLevel level, string message) + { + if (!IsEnabled(level)) return; + Write(level, message, null); + } + + /// + /// 核心日志记录方法(带参数格式化) + /// + /// 日志级别 + /// 格式化字符串 + /// 格式化参数数组 + private void Log(LogLevel level, string format, params object[] args) + { + if (!IsEnabled(level)) return; + Write(level, string.Format(format, args), null); + } + + /// + /// 核心日志记录方法(带异常) + /// + /// 日志级别 + /// 日志消息 + /// 异常对象 + private void Log(LogLevel level, string message, Exception exception) + { + if (!IsEnabled(level)) return; + Write(level, message, exception); + } + + #endregion + + /// + /// 平台输出入口,由具体实现负责真正的日志写入。 + /// + /// 日志级别 + /// 日志消息 + /// 异常对象(可为null) + protected abstract void Write(LogLevel level, string message, Exception? exception); +} diff --git a/GFramework.Core/logging/ConsoleLogger.cs b/GFramework.Core/logging/ConsoleLogger.cs index 2925fa0..d1e58bf 100644 --- a/GFramework.Core/logging/ConsoleLogger.cs +++ b/GFramework.Core/logging/ConsoleLogger.cs @@ -3,371 +3,26 @@ namespace GFramework.Core.logging; /// /// 控制台日志记录器 /// -public sealed class ConsoleLogger : ILogger +public sealed class ConsoleLogger( + string? name = null, + LogLevel minLevel = LogLevel.Info, + TextWriter? writer = null, + bool useColors = true) : AbstractLogger(name ?? ILogger.RootLoggerName, minLevel) { - private readonly LogLevel _minLevel; - private readonly string _name; - private readonly TextWriter _writer; - private readonly bool _useColors; - + private readonly TextWriter _writer = writer ?? Console.Out; + private readonly bool _useColors = useColors && writer == Console.Out; + /// - /// 初始化控制台日志记录器实例 - /// - /// 日志记录器名称,默认为根日志记录器名称 - /// 最小日志级别,默认为Info级别 - /// 文本写入器,默认为控制台输出 - /// 是否使用颜色输出,默认为true - public ConsoleLogger( - string? name = null, - LogLevel minLevel = LogLevel.Info, - TextWriter? writer = null, - bool useColors = true) - { - _name = name ?? ILogger.RootLoggerName; - _minLevel = minLevel; - _writer = writer ?? Console.Out; - _useColors = useColors && _writer == Console.Out; - } - - #region Metadata - - /// - /// 获取日志记录器名称 - /// - /// 日志记录器名称 - public string Name() => _name; - - #endregion - - #region Level Checks - - /// - /// 检查是否启用Trace级别日志 - /// - /// 如果启用返回true,否则返回false - public bool IsTraceEnabled() => IsEnabled(LogLevel.Trace); - - /// - /// 检查是否启用Debug级别日志 - /// - /// 如果启用返回true,否则返回false - public bool IsDebugEnabled() => IsEnabled(LogLevel.Debug); - - /// - /// 检查是否启用Info级别日志 - /// - /// 如果启用返回true,否则返回false - public bool IsInfoEnabled() => IsEnabled(LogLevel.Info); - - /// - /// 检查是否启用Warn级别日志 - /// - /// 如果启用返回true,否则返回false - public bool IsWarnEnabled() => IsEnabled(LogLevel.Warning); - - /// - /// 检查是否启用Error级别日志 - /// - /// 如果启用返回true,否则返回false - public bool IsErrorEnabled() => IsEnabled(LogLevel.Error); - - /// - /// 检查是否启用Fatal级别日志 - /// - /// 如果启用返回true,否则返回false - public bool IsFatalEnabled() => IsEnabled(LogLevel.Fatal); - - /// - /// 检查指定日志级别是否启用 - /// - /// 要检查的日志级别 - /// 如果启用返回true,否则返回false - private bool IsEnabled(LogLevel level) => level >= _minLevel; - - #endregion - - #region Trace - - /// - /// 记录Trace级别日志消息 - /// - /// 日志消息 - public void Trace(string msg) => LogIfEnabled(LogLevel.Trace, msg); - - /// - /// 记录Trace级别日志消息(带格式化参数) - /// - /// 格式化字符串 - /// 格式化参数 - public void Trace(string format, object arg) => LogIfEnabled(LogLevel.Trace, format, arg); - - /// - /// 记录Trace级别日志消息(带两个格式化参数) - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Trace(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Trace, format, arg1, arg2); - - /// - /// 记录Trace级别日志消息(带多个格式化参数) - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Trace(string format, params object[] arguments) => LogIfEnabled(LogLevel.Trace, format, arguments); - - /// - /// 记录Trace级别异常日志 - /// - /// 日志消息 - /// 异常对象 - public void Trace(string msg, Exception t) => LogException(LogLevel.Trace, msg, t); - - #endregion - - #region Debug - - /// - /// 记录Debug级别日志消息 - /// - /// 日志消息 - public void Debug(string msg) => LogIfEnabled(LogLevel.Debug, msg); - - /// - /// 记录Debug级别日志消息(带格式化参数) - /// - /// 格式化字符串 - /// 格式化参数 - public void Debug(string format, object arg) => LogIfEnabled(LogLevel.Debug, format, arg); - - /// - /// 记录Debug级别日志消息(带两个格式化参数) - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Debug(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Debug, format, arg1, arg2); - - /// - /// 记录Debug级别日志消息(带多个格式化参数) - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Debug(string format, params object[] arguments) => LogIfEnabled(LogLevel.Debug, format, arguments); - - /// - /// 记录Debug级别异常日志 - /// - /// 日志消息 - /// 异常对象 - public void Debug(string msg, Exception t) => LogException(LogLevel.Debug, msg, t); - - #endregion - - #region Info - - /// - /// 记录Info级别日志消息 - /// - /// 日志消息 - public void Info(string msg) => LogIfEnabled(LogLevel.Info, msg); - - /// - /// 记录Info级别日志消息(带格式化参数) - /// - /// 格式化字符串 - /// 格式化参数 - public void Info(string format, object arg) => LogIfEnabled(LogLevel.Info, format, arg); - - /// - /// 记录Info级别日志消息(带两个格式化参数) - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Info(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Info, format, arg1, arg2); - - /// - /// 记录Info级别日志消息(带多个格式化参数) - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Info(string format, params object[] arguments) => LogIfEnabled(LogLevel.Info, format, arguments); - - /// - /// 记录Info级别异常日志 - /// - /// 日志消息 - /// 异常对象 - public void Info(string msg, Exception t) => LogException(LogLevel.Info, msg, t); - - #endregion - - #region Warn - - /// - /// 记录Warn级别日志消息 - /// - /// 日志消息 - public void Warn(string msg) => LogIfEnabled(LogLevel.Warning, msg); - - /// - /// 记录Warn级别日志消息(带格式化参数) - /// - /// 格式化字符串 - /// 格式化参数 - public void Warn(string format, object arg) => LogIfEnabled(LogLevel.Warning, format, arg); - - /// - /// 记录Warn级别日志消息(带两个格式化参数) - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Warn(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Warning, format, arg1, arg2); - - /// - /// 记录Warn级别日志消息(带多个格式化参数) - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Warn(string format, params object[] arguments) => LogIfEnabled(LogLevel.Warning, format, arguments); - - /// - /// 记录Warn级别异常日志 - /// - /// 日志消息 - /// 异常对象 - public void Warn(string msg, Exception t) => LogException(LogLevel.Warning, msg, t); - - #endregion - - #region Error - - /// - /// 记录Error级别日志消息 - /// - /// 日志消息 - public void Error(string msg) => LogIfEnabled(LogLevel.Error, msg); - - /// - /// 记录Error级别日志消息(带格式化参数) - /// - /// 格式化字符串 - /// 格式化参数 - public void Error(string format, object arg) => LogIfEnabled(LogLevel.Error, format, arg); - - /// - /// 记录Error级别日志消息(带两个格式化参数) - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Error(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Error, format, arg1, arg2); - - /// - /// 记录Error级别日志消息(带多个格式化参数) - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Error(string format, params object[] arguments) => LogIfEnabled(LogLevel.Error, format, arguments); - - /// - /// 记录Error级别异常日志 - /// - /// 日志消息 - /// 异常对象 - public void Error(string msg, Exception t) => LogException(LogLevel.Error, msg, t); - - #endregion - - #region Fatal - - /// - /// 记录Fatal级别日志消息 - /// - /// 日志消息 - public void Fatal(string msg) => LogIfEnabled(LogLevel.Fatal, msg); - - /// - /// 记录Fatal级别日志消息(带格式化参数) - /// - /// 格式化字符串 - /// 格式化参数 - public void Fatal(string format, object arg) => LogIfEnabled(LogLevel.Fatal, format, arg); - - /// - /// 记录Fatal级别日志消息(带两个格式化参数) - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Fatal(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Fatal, format, arg1, arg2); - - /// - /// 记录Fatal级别日志消息(带多个格式化参数) - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Fatal(string format, params object[] arguments) => LogIfEnabled(LogLevel.Fatal, format, arguments); - - /// - /// 记录Fatal级别异常日志 - /// - /// 日志消息 - /// 异常对象 - public void Fatal(string msg, Exception t) => LogException(LogLevel.Fatal, msg, t); - - #endregion - - #region Internal Core - - /// - /// 如果指定级别已启用,则记录日志消息 + /// 写入日志消息到控制台 /// /// 日志级别 /// 日志消息 - private void LogIfEnabled(LogLevel level, string message) - { - if (!IsEnabled(level)) return; - LogInternal(level, message, null); - } - - /// - /// 如果指定级别已启用,则记录格式化日志消息 - /// - /// 日志级别 - /// 格式化字符串 - /// 格式化参数数组 - private void LogIfEnabled(LogLevel level, string format, params object[] args) - { - if (!IsEnabled(level)) return; - LogInternal(level, string.Format(format, args), null); - } - - /// - /// 如果指定级别已启用,则记录异常日志 - /// - /// 日志级别 - /// 日志消息 - /// 异常对象 - private void LogException(LogLevel level, string message, Exception exception) - { - if (!IsEnabled(level)) return; - LogInternal(level, message, exception); - } - - /// - /// 内部日志记录方法 - /// - /// 日志级别 - /// 日志消息 - /// 异常对象(可选) - private void LogInternal(LogLevel level, string message, Exception? exception) + /// 异常信息,可为空 + protected override void Write(LogLevel level, string message, Exception? exception) { var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var levelStr = level.ToString().ToUpper().PadRight(7); - var log = $"[{timestamp}] {levelStr} [{_name}] {message}"; + var log = $"[{timestamp}] {levelStr} [{Name()}] {message}"; // 添加异常信息到日志 if (exception != null) @@ -384,7 +39,8 @@ public sealed class ConsoleLogger : ILogger _writer.WriteLine(log); } } - + + #region Internal Core /// /// 以指定颜色写入日志消息 /// diff --git a/GFramework.Core/logging/ILogger.cs b/GFramework.Core/logging/ILogger.cs index 495272c..55b573e 100644 --- a/GFramework.Core/logging/ILogger.cs +++ b/GFramework.Core/logging/ILogger.cs @@ -74,8 +74,7 @@ public interface ILogger } #endregion - - + #region Trace Logging Methods /// diff --git a/GFramework.Core/logging/NoopLogger.cs b/GFramework.Core/logging/NoopLogger.cs index 02295bb..bc6e2f0 100644 --- a/GFramework.Core/logging/NoopLogger.cs +++ b/GFramework.Core/logging/NoopLogger.cs @@ -3,368 +3,19 @@ /// /// 空操作日志记录器实现,不执行任何实际的日志记录操作 /// -internal sealed class NoopLogger : ILogger +/// 日志记录器名称,默认为null +/// 最小日志级别,默认为Info +internal sealed class NoopLogger( + string? name = null, + LogLevel minLevel = LogLevel.Info) : AbstractLogger(name ?? ILogger.RootLoggerName, minLevel) { /// - /// 获取日志记录器的名称 + /// 重写写入方法,空操作实现,不执行任何实际的日志记录操作 /// - /// 返回"NOOP"字符串 - public string Name() - { - return "NOOP"; - } - - /// - /// 检查是否启用了跟踪级别日志 - /// - /// 始终返回false - public bool IsTraceEnabled() - { - return false; - } - - /// - /// 检查是否启用了调试级别日志 - /// - /// 始终返回false - public bool IsDebugEnabled() - { - return false; - } - - /// - /// 检查是否启用了信息级别日志 - /// - /// 始终返回false - public bool IsInfoEnabled() - { - return false; - } - - /// - /// 检查是否启用了警告级别日志 - /// - /// 始终返回false - public bool IsWarnEnabled() - { - return false; - } - - /// - /// 检查是否启用了错误级别日志 - /// - /// 始终返回false - public bool IsErrorEnabled() - { - return false; - } - - /// - /// 检查是否启用了致命错误级别日志 - /// - /// 始终返回false - public bool IsFatalEnabled() - { - return false; - } - - - /// - /// 记录跟踪级别日志消息 - /// - /// 要记录的消息 - public void Trace(string msg) - { - - } - - /// - /// 记录跟踪级别日志消息,支持格式化参数 - /// - /// 格式化字符串 - /// 格式化参数 - public void Trace(string format, object arg) - { - - } - - /// - /// 记录跟踪级别日志消息,支持两个格式化参数 - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Trace(string format, object arg1, object arg2) - { - - } - - /// - /// 记录跟踪级别日志消息,支持多个格式化参数 - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Trace(string format, params object[] arguments) - { - - } - - /// - /// 记录跟踪级别日志消息和异常信息 - /// - /// 要记录的消息 - /// 要记录的异常 - public void Trace(string msg, Exception t) - { - - } - - /// - /// 记录调试级别日志消息 - /// - /// 要记录的消息 - public void Debug(string msg) - { - - } - - /// - /// 记录调试级别日志消息,支持格式化参数 - /// - /// 格式化字符串 - /// 格式化参数 - public void Debug(string format, object arg) - { - - } - - /// - /// 记录调试级别日志消息,支持两个格式化参数 - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Debug(string format, object arg1, object arg2) - { - - } - - /// - /// 记录调试级别日志消息,支持多个格式化参数 - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Debug(string format, params object[] arguments) - { - - } - - /// - /// 记录调试级别日志消息和异常信息 - /// - /// 要记录的消息 - /// 要记录的异常 - public void Debug(string msg, Exception t) - { - - } - - /// - /// 记录信息级别日志消息 - /// - /// 要记录的消息 - public void Info(string msg) - { - - } - - /// - /// 记录信息级别日志消息,支持格式化参数 - /// - /// 格式化字符串 - /// 格式化参数 - public void Info(string format, object arg) - { - - } - - /// - /// 记录信息级别日志消息,支持两个格式化参数 - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Info(string format, object arg1, object arg2) - { - - } - - /// - /// 记录信息级别日志消息,支持多个格式化参数 - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Info(string format, params object[] arguments) - { - - } - - /// - /// 记录信息级别日志消息和异常信息 - /// - /// 要记录的消息 - /// 要记录的异常 - public void Info(string msg, Exception t) - { - - } - - /// - /// 记录警告级别日志消息 - /// - /// 要记录的消息 - public void Warn(string msg) - { - - } - - /// - /// 记录警告级别日志消息,支持格式化参数 - /// - /// 格式化字符串 - /// 格式化参数 - public void Warn(string format, object arg) - { - - } - - /// - /// 记录警告级别日志消息,支持两个格式化参数 - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Warn(string format, object arg1, object arg2) - { - - } - - /// - /// 记录警告级别日志消息,支持多个格式化参数 - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Warn(string format, params object[] arguments) - { - - } - - /// - /// 记录警告级别日志消息和异常信息 - /// - /// 要记录的消息 - /// 要记录的异常 - public void Warn(string msg, Exception t) - { - - } - - /// - /// 记录错误级别日志消息 - /// - /// 要记录的消息 - public void Error(string msg) - { - - } - - /// - /// 记录错误级别日志消息,支持格式化参数 - /// - /// 格式化字符串 - /// 格式化参数 - public void Error(string format, object arg) - { - - } - - /// - /// 记录错误级别日志消息,支持两个格式化参数 - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Error(string format, object arg1, object arg2) - { - - } - - /// - /// 记录错误级别日志消息,支持多个格式化参数 - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Error(string format, params object[] arguments) - { - - } - - /// - /// 记录错误级别日志消息和异常信息 - /// - /// 要记录的消息 - /// 要记录的异常 - public void Error(string msg, Exception t) - { - - } - - /// - /// 记录致命错误级别日志消息 - /// - /// 要记录的消息 - public void Fatal(string msg) - { - - } - - /// - /// 记录致命错误级别日志消息,支持格式化参数 - /// - /// 格式化字符串 - /// 格式化参数 - public void Fatal(string format, object arg) - { - - } - - /// - /// 记录致命错误级别日志消息,支持两个格式化参数 - /// - /// 格式化字符串 - /// 第一个格式化参数 - /// 第二个格式化参数 - public void Fatal(string format, object arg1, object arg2) - { - - } - - /// - /// 记录致命错误级别日志消息,支持多个格式化参数 - /// - /// 格式化字符串 - /// 格式化参数数组 - public void Fatal(string format, params object[] arguments) - { - - } - - /// - /// 记录致命错误级别日志消息和异常信息 - /// - /// 要记录的消息 - /// 要记录的异常 - public void Fatal(string msg, Exception t) + /// 日志级别 + /// 日志消息 + /// 异常信息 + protected override void Write(LogLevel level, string message, Exception? exception) { } diff --git a/GFramework.Godot/architecture/AbstractArchitecture.cs b/GFramework.Godot/architecture/AbstractArchitecture.cs index ad35769..c2d2135 100644 --- a/GFramework.Godot/architecture/AbstractArchitecture.cs +++ b/GFramework.Godot/architecture/AbstractArchitecture.cs @@ -9,8 +9,7 @@ namespace GFramework.Godot.architecture; /// 抽象架构类,为特定类型的架构提供基础实现框架。 /// 此类负责管理架构的初始化、生命周期绑定以及扩展模块的安装与销毁。 /// -/// 架构的具体类型,必须继承自Architecture且能被实例化。 -public abstract class AbstractArchitecture : Architecture where T : Architecture, new() +public abstract class AbstractArchitecture: Architecture { /// @@ -23,7 +22,7 @@ public abstract class AbstractArchitecture : Architecture where T : Archit /// 存储所有已安装的Godot架构扩展组件列表 /// 用于在架构销毁时正确清理所有扩展资源 /// - private readonly List> _extensions = []; + private readonly List _extensions = []; /// /// 架构锚点节点引用 @@ -90,7 +89,7 @@ public abstract class AbstractArchitecture : Architecture where T : Archit /// 模块类型,必须实现IGodotModule接口 /// 要安装的模块实例 /// 异步任务 - protected async Task InstallGodotModule(TModule module) where TModule : IGodotModule + protected async Task InstallGodotModule(TModule module) where TModule : IGodotModule { module.Install(this); diff --git a/GFramework.Godot/architecture/AbstractGodotModule.cs b/GFramework.Godot/architecture/AbstractGodotModule.cs index e89975b..2d2c09f 100644 --- a/GFramework.Godot/architecture/AbstractGodotModule.cs +++ b/GFramework.Godot/architecture/AbstractGodotModule.cs @@ -6,8 +6,7 @@ namespace GFramework.Godot.architecture; /// /// 抽象的Godot模块基类,用于定义Godot框架中的模块行为 /// -/// 架构类型,必须继承自Architecture并且有无参构造函数 -public abstract class AbstractGodotModule: IGodotModule where T : Architecture, new() +public abstract class AbstractGodotModule: IGodotModule { /// /// 当架构阶段发生变化时调用此方法 @@ -43,7 +42,7 @@ public abstract class AbstractGodotModule: IGodotModule where T : Architec /// 当模块被附加到架构时调用此方法 /// /// 被附加到的架构实例 - public virtual void OnAttach(Architecture architecture) + public virtual void OnAttach(Architecture architecture) { } diff --git a/GFramework.Godot/architecture/IGodotModule.cs b/GFramework.Godot/architecture/IGodotModule.cs index 7242005..154f521 100644 --- a/GFramework.Godot/architecture/IGodotModule.cs +++ b/GFramework.Godot/architecture/IGodotModule.cs @@ -6,23 +6,21 @@ namespace GFramework.Godot.architecture; /// /// Godot模块接口,定义了Godot引擎中模块的基本行为和属性 /// -/// 架构类型,必须继承自Architecture<T>且具有无参构造函数 -public interface IGodotModule : IArchitectureModule where T : Architecture, new() +public interface IGodotModule : IArchitectureModule { /// /// 获取模块关联的Godot节点 /// Node Node { get; } - + /// /// 当模块被附加到架构时调用 /// /// 要附加到的架构实例 - void OnAttach(Architecture architecture); - + void OnAttach(Architecture architecture); + /// /// 当模块从架构分离时调用 /// void OnDetach(); -} - +} \ No newline at end of file diff --git a/GFramework.Godot/assets/AbstractResourceFactorySystem.cs b/GFramework.Godot/assets/AbstractResourceFactorySystem.cs index 0873083..5745f45 100644 --- a/GFramework.Godot/assets/AbstractResourceFactorySystem.cs +++ b/GFramework.Godot/assets/AbstractResourceFactorySystem.cs @@ -1,11 +1,10 @@ using GFramework.Core.architecture; -using GFramework.Core.events; -using GFramework.Core.extensions; using GFramework.Core.system; using GFramework.Game.assets; +using GFramework.Godot.system; using Godot; -namespace GFramework.Godot.system; +namespace GFramework.Godot.assets; /// /// 资源工厂系统抽象基类,用于统一管理各类资源的创建与预加载逻辑。 @@ -25,16 +24,16 @@ public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceF protected override void OnInit() { _registry = new ResourceFactory.Registry(); - _resourceLoadSystem = this.GetSystem(); - _assetCatalogSystem = this.GetSystem(); + _resourceLoadSystem = Context.GetSystem(); + _assetCatalogSystem = Context.GetSystem(); } /// /// 架构阶段回调,在架构就绪时注册和预加载资源 /// /// 当前架构阶段 - /// 架构实例 - public void OnPhase(ArchitecturePhase phase, IArchitecture arch) + /// 架构实例 + public void OnPhase(ArchitecturePhase phase, IArchitecture architecture) { if (phase == ArchitecturePhase.Ready) { diff --git a/GFramework.Godot/component/AbstractDragDrop2DComponentBase.cs b/GFramework.Godot/component/AbstractDragDrop2DComponentBase.cs deleted file mode 100644 index d867eb7..0000000 --- a/GFramework.Godot/component/AbstractDragDrop2DComponentBase.cs +++ /dev/null @@ -1,100 +0,0 @@ -using GFramework.Core.architecture; -using GFramework.Core.controller; -using GFramework.Core.events; -using GFramework.Core.extensions; -using Godot; - -namespace GFramework.Godot.component; - -/// -/// 抽象基类,用于实现2D拖拽功能的组件。 -/// 继承自Godot的Node类并实现了IController接口。 -/// 提供了拖拽相关的信号定义以及基础属性配置。 -/// -public abstract partial class AbstractDragDrop2DComponentBase : Node, IController -{ - /// - /// 取消注册列表,用于管理需要在节点销毁时取消注册的对象 - /// - protected readonly IUnRegisterList UnRegisterList = new UnRegisterList(); - - /// - /// 当拖拽被取消时触发的信号。 - /// - /// 拖拽起始位置。 - [Signal] - public delegate void DragCanceledEventHandler(Vector2 startingPosition); - - /// - /// 当拖拽开始时触发的信号。 - /// - [Signal] - public delegate void DragStartedEventHandler(); - - /// - /// 当拖拽结束并放置时触发的信号。 - /// - /// 拖拽起始位置。 - [Signal] - public delegate void DroppedEventHandler(Vector2 startingPosition); - - /// - /// 是否启用拖拽功能。若为 false,则忽略所有输入事件。 - /// - public bool Enable { get; set; } - - /// - /// 拖拽组的名称,用于区分不同的拖拽组。 - /// - public string GroupName { get; set; } = "dragging"; - - /// - /// 获取或设置取消拖拽输入操作的名称 - /// - public string CancelDragInputActionName { get; set; } = "cancel_drag"; - - /// - /// 获取或设置选择输入操作的名称 - /// - public string SelectInputActionName { get; set; } = "select"; - - /// - /// 拖拽时元素的最大Z轴索引值。 - /// - public int ZIndexMax { get; set; } = 99; - - /// - /// 拖拽时元素的最小Z轴索引值。 - /// - public int ZIndexMin { get; set; } = 0; - - /// - /// 获取架构实例。 - /// - /// 返回实现IArchitecture接口的架构实例。 - public abstract IArchitecture GetArchitecture(); - - /// - /// 表示是否正在拖拽操作的标志位。 - /// - protected bool IsDragging; - - /// - /// 表示拖拽操作中的偏移量,用于计算当前位置与起始位置的差值。 - /// - protected Vector2 Offset = Vector2.Zero; - - /// - /// 表示拖拽操作的起始位置坐标。 - /// - protected Vector2 StartingPosition; - - /// - /// 节点退出场景树时的回调方法。 - /// 在节点从场景树移除前调用,用于清理资源。 - /// - public override void _ExitTree() - { - UnRegisterList.UnRegisterAll(); - } -} \ No newline at end of file diff --git a/GFramework.Godot/component/AbstractDragDropArea2DComponent.cs b/GFramework.Godot/component/AbstractDragDropArea2DComponent.cs deleted file mode 100644 index 3de75da..0000000 --- a/GFramework.Godot/component/AbstractDragDropArea2DComponent.cs +++ /dev/null @@ -1,127 +0,0 @@ -using GFramework.Godot.extensions; -using Godot; - -namespace GFramework.Godot.component; - -/// -/// 抽象拖拽组件类,用于处理节点的拖放逻辑。 -/// 实现了 IController 接口以支持架构通信,并通过信号通知拖拽事件的发生。 -/// -public abstract partial class AbstractDragDropArea2DComponent : AbstractDragDrop2DComponentBase -{ - /// - /// 目标区域,通常是可交互的游戏对象(如单位或物品)所在的碰撞区域。 - /// - public required Area2D Target { get; set; } - - /// - /// 节点准备就绪时的回调方法。 - /// 在节点添加到场景树后调用,绑定目标区域的输入事件处理器。 - /// - public override void _Ready() - { - Target = GetParent() as Area2D ?? throw new InvalidOperationException("Target must be an Area2D node."); - Target.InputEvent += OnTargetInputEvent; - } - - /// - /// 处理输入事件的回调方法。 - /// 根据当前拖拽状态和输入事件类型,执行相应的拖拽操作。 - /// - /// 输入事件对象 - public override void _Input(InputEvent @event) - { - switch (IsDragging) - { - // 处理取消拖拽操作:当正在拖拽且按下取消拖拽按键时,执行取消拖拽逻辑 - case true when Target.IsValidNode() && @event.IsActionPressed(CancelDragInputActionName): - CancelDragging(); - // 设置输入为处理,防止输入穿透 - this.SetInputAsHandled(); - break; - case true when @event.IsActionReleased(SelectInputActionName): - Drop(); - break; - } - } - - /// - /// 目标区域的输入事件处理器。 - /// 当目标区域接收到输入事件时被调用,用于控制拖拽的开始和结束。 - /// - /// 事件发生的视口节点 - /// 输入事件对象 - /// 事件触点ID(未使用) - private void OnTargetInputEvent(Node viewport, InputEvent @event, long _) - { - if (!Enable) return; - - // 获取当前正在拖拽的对象 - var draggingObj = GetTree().GetFirstNodeInGroup(GroupName); - switch (IsDragging) - { - // 处理开始拖拽操作:当未在拖拽状态且按下选择按键时,开始拖拽 - case false when - // 如果当前没有拖拽操作且已有其他对象正在拖拽,则直接返回 - draggingObj is not null: - return; - case false when @event.IsActionPressed(SelectInputActionName): - StartDragging(); - break; - } - } - - /// - /// 每帧更新逻辑,在拖拽过程中持续更新目标的位置。 - /// - /// 与上一帧的时间间隔(秒)。 - public override void _Process(double delta) - { - if (IsDragging && Target.IsValidNode()) Target.GlobalPosition = Target.GetGlobalMousePosition() + Offset; - } - - /// - /// 结束拖拽流程的基础方法。 - /// 清除拖拽标志位并将目标从拖拽组中移除,恢复其层级顺序。 - /// - private void EndDragging() - { - IsDragging = false; - Target.RemoveFromGroup(GroupName); - Target.ZIndex = ZIndexMin; - } - - /// - /// 执行取消拖拽的操作。 - /// 调用 EndDragging 并发出 DragCanceled 信号。 - /// - private void CancelDragging() - { - EndDragging(); - EmitSignalDragCanceled(StartingPosition); - } - - /// - /// 开始拖拽操作。 - /// 设置初始位置和偏移量,将目标加入拖拽组并提升显示层级,最后发出 DragStarted 信号。 - /// - private void StartDragging() - { - IsDragging = true; - StartingPosition = Target.GlobalPosition; - Target.AddToGroup(GroupName); - Target.ZIndex = ZIndexMax; - Offset = Target.GlobalPosition - Target.GetGlobalMousePosition(); - EmitSignalDragStarted(); - } - - /// - /// 完成一次拖拽操作。 - /// 调用 EndDragging 方法并发出 Dropped 信号。 - /// - private void Drop() - { - EndDragging(); - EmitSignalDropped(StartingPosition); - } -} \ No newline at end of file diff --git a/GFramework.Godot/logging/GodotLogProvider.cs b/GFramework.Godot/logging/GodotLogProvider.cs deleted file mode 100644 index 312d5ef..0000000 --- a/GFramework.Godot/logging/GodotLogProvider.cs +++ /dev/null @@ -1,17 +0,0 @@ -using GFramework.Core.logging; - -namespace GFramework.Godot.logging; - -/// -/// Godot日志提供程序,实现ILogProvider接口,用于创建GodotLogger实例 -/// -public sealed class GodotLogProvider : ILogProvider -{ - /// - /// 创建指定类别的日志记录器 - /// - /// 日志类别名称 - /// 返回GodotLogger实例 - public ILogger CreateLogger(string category) - => new GodotLogger(category); -} diff --git a/GFramework.Godot/logging/GodotLogger.cs b/GFramework.Godot/logging/GodotLogger.cs index 8f2605b..cf20e97 100644 --- a/GFramework.Godot/logging/GodotLogger.cs +++ b/GFramework.Godot/logging/GodotLogger.cs @@ -6,77 +6,34 @@ namespace GFramework.Godot.logging; /// /// Godot平台的日志记录器实现 /// -public sealed class GodotLogger : ILogger +public sealed class GodotLogger( + string? name = null, + LogLevel minLevel = LogLevel.Info) : AbstractLogger(name??ILogger.RootLoggerName, minLevel) { - private readonly string _category; - - public GodotLogger(string category) => _category = category; - /// - /// 记录日志消息到Godot控制台 - /// - /// 日志级别 - /// 日志消息 - /// 关联的异常对象 - /// 日志上下文 - public void Log(LogLevel level, string message, Exception? exception, object? context) + protected override void Write(LogLevel level, string message, Exception? exception) { - var prefix = $"[{level}]"; + var prefix = $"[{level.ToString().ToUpper()}][{Name()}]"; + // 将异常信息追加到日志消息中 if (exception != null) - message += $"\n{exception}"; + { + message += "\n" + exception; + } + // 根据日志级别选择不同的输出方法 switch (level) { case LogLevel.Error: case LogLevel.Fatal: - GD.PrintErr(prefix, message); + 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); + GD.Print($"{prefix} {message}"); break; } } - - /// - /// 检查指定日志级别是否启用 - /// - /// 日志级别 - /// 始终返回 true - public bool IsEnabled(LogLevel level) => true; - - public void Info(string msg, object? ctx = null) - { - Log(LogLevel.Info, msg, null, ctx); - } - - public void Error(string msg, Exception? ex = null, object? ctx = null) - { - Log(LogLevel.Error, msg, ex, ctx); - } - - public void Debug(string msg, object? ctx = null) - { - Log(LogLevel.Debug, msg, null, ctx); - } - - public void Trace(string msg, object? ctx = null) - { - Log(LogLevel.Trace, msg, null, ctx); - } - - public void Warn(string msg, object? ctx = null) - { - Log(LogLevel.Warning, msg, null, ctx); - } - - public void Fatal(string msg,Exception? ex = null, object? ctx = null) - { - Log(LogLevel.Fatal, msg, ex, ctx); - } -} +} \ No newline at end of file diff --git a/GFramework.Godot/logging/GodotLoggerFactory.cs b/GFramework.Godot/logging/GodotLoggerFactory.cs new file mode 100644 index 0000000..2694db4 --- /dev/null +++ b/GFramework.Godot/logging/GodotLoggerFactory.cs @@ -0,0 +1,19 @@ +using GFramework.Core.logging; + +namespace GFramework.Godot.logging; + +/// +/// Godot日志工厂类,用于创建Godot平台专用的日志记录器实例 +/// +public class GodotLoggerFactory: ILoggerFactory +{ + /// + /// 获取指定名称的日志记录器实例 + /// + /// 日志记录器的名称 + /// 返回GodotLogger类型的日志记录器实例 + public ILogger GetLogger(string name) + { + return new GodotLogger(name); + } +} diff --git a/GFramework.Godot/system/AbstractAudioManagerSystem.cs b/GFramework.Godot/system/AbstractAudioManagerSystem.cs index 6b0de52..7504f49 100644 --- a/GFramework.Godot/system/AbstractAudioManagerSystem.cs +++ b/GFramework.Godot/system/AbstractAudioManagerSystem.cs @@ -1,4 +1,3 @@ -using GFramework.Core.extensions; using GFramework.Core.system; using GFramework.Game.assets; using Godot; @@ -106,9 +105,9 @@ public abstract class AbstractAudioManagerSystem : AbstractSystem, IAudioManager protected override void OnInit() { // 获取依赖的系统 - ResourceLoadSystem = this.GetSystem(); - AssetCatalogSystem = this.GetSystem(); - ResourceFactorySystem = this.GetSystem(); + ResourceLoadSystem = Context.GetSystem(); + AssetCatalogSystem = Context.GetSystem(); + ResourceFactorySystem = Context.GetSystem(); // 初始化背景音乐播放器 MusicPlayer = new AudioStreamPlayer();