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();