using System.IO; using GFramework.Core.Abstractions.Logging; namespace GFramework.Core.Logging.Appenders; /// /// 控制台日志输出器 /// public sealed class ConsoleAppender : ILogAppender, IDisposable { private readonly ILogFilter? _filter; private readonly ILogFormatter _formatter; private readonly bool _useColors; private readonly TextWriter _writer; /// /// 创建控制台日志输出器 /// /// 日志格式化器 /// 文本写入器(默认为 Console.Out) /// 是否使用颜色(默认为 true) /// 日志过滤器(可选) public ConsoleAppender( ILogFormatter formatter, TextWriter? writer = null, bool useColors = true, ILogFilter? filter = null) { _formatter = formatter ?? throw new ArgumentNullException(nameof(formatter)); _writer = writer ?? Console.Out; _useColors = useColors && _writer == Console.Out; _filter = filter; } /// /// 释放资源 /// public void Dispose() { _writer.Flush(); } /// /// 追加日志条目到控制台 /// /// 日志条目 public void Append(LogEntry entry) { if (_filter != null && !_filter.ShouldLog(entry)) return; var message = _formatter.Format(entry); if (_useColors) { WriteColored(entry.Level, message); } else { _writer.WriteLine(message); } } /// /// 刷新控制台输出 /// public void Flush() { _writer.Flush(); } private void WriteColored(LogLevel level, string message) { var colorCode = GetAnsiColorCode(level); _writer.WriteLine($"\x1b[{colorCode}m{message}\x1b[0m"); } private static string GetAnsiColorCode(LogLevel level) { return level switch { LogLevel.Trace => "90", // 暗灰色 LogLevel.Debug => "36", // 青色 LogLevel.Info => "37", // 白色 LogLevel.Warning => "33", // 黄色 LogLevel.Error => "31", // 红色 LogLevel.Fatal => "35", // 洋红色 _ => "37" }; } }