namespace GFramework.Core.logging; /// /// 控制台日志记录器实现,支持日志级别控制和格式化输出 /// public sealed class ConsoleLogger : ILog { private readonly LogLevel _minLevel; private readonly string? _category; private readonly TextWriter? _writer; private readonly bool _useColors; /// /// 构造函数 /// /// 日志类别 /// 最小日志级别(默认Info) /// 输出流(默认控制台) /// 是否使用颜色输出(默认true) public ConsoleLogger( string? category = null, LogLevel minLevel = LogLevel.Info, TextWriter? writer = null, bool useColors = true) { _category = category; _minLevel = minLevel; _writer = writer ?? Console.Out; _useColors = useColors && _writer == Console.Out; } /// /// 记录日志消息 /// /// 日志级别 /// 日志消息 /// 异常信息(可选) /// 上下文信息(可选) public void Log(LogLevel level, string message, Exception? exception = null, object? context = null) { if (!IsEnabled(level)) return; var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var levelStr = level.ToString().ToUpper().PadRight(7); var categoryStr = _category != null ? $"[{_category}] " : ""; var contextStr = context != null ? $" | Context: {FormatContext(context)}" : ""; var exceptionStr = exception != null ? $"\nException: {exception}" : ""; var logMessage = $"[{timestamp}] {levelStr} {categoryStr}{message}{contextStr}{exceptionStr}"; if (_useColors) { WriteColored(level, logMessage); } else { _writer!.WriteLine(logMessage); } } /// /// 检查指定日志级别是否启用 /// /// 要检查的日志级别 /// 如果启用则返回true,否则返回false public bool IsEnabled(LogLevel level) => level >= _minLevel; /// /// 获取当前最小日志级别 /// public LogLevel MinLevel => _minLevel; /// /// 使用颜色写入日志消息 /// /// 日志级别 /// 要写入的消息 private void WriteColored(LogLevel level, string message) { var originalColor = Console.ForegroundColor; try { Console.ForegroundColor = GetColor(level); _writer!.WriteLine(message); } finally { Console.ForegroundColor = originalColor; } } /// /// 根据日志级别获取对应的颜色 /// /// 日志级别 /// 对应的控制台颜色 private static ConsoleColor GetColor(LogLevel level) { return level switch { LogLevel.Trace => ConsoleColor.Gray, LogLevel.Debug => ConsoleColor.Cyan, LogLevel.Info => ConsoleColor.White, LogLevel.Warning => ConsoleColor.Yellow, LogLevel.Error => ConsoleColor.Red, LogLevel.Fatal => ConsoleColor.Magenta, _ => ConsoleColor.White }; } /// /// 格式化上下文对象为字符串 /// /// 上下文对象 /// 格式化后的字符串 private static string FormatContext(object context) { return context switch { string str => str, int num => num.ToString(), null => "null", _ => $"{context.GetType().Name}: {context}" }; } // 快捷方法实现 /// /// 记录信息级别日志 /// /// 日志消息 /// 上下文信息(可选) 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); }