using Microsoft.Extensions.Logging.Abstractions; namespace GSS2.Test; public sealed class ConsoleFormatter : Microsoft.Extensions.Logging.Console.ConsoleFormatter { private static class Ansi { public const string Reset = "\x1b[0m"; public static string Color(ConsoleColor color) => color switch { ConsoleColor.Black => "\x1b[30m", ConsoleColor.DarkRed => "\x1b[31m", ConsoleColor.DarkGreen => "\x1b[32m", ConsoleColor.DarkYellow => "\x1b[33m", ConsoleColor.DarkBlue => "\x1b[34m", ConsoleColor.DarkMagenta => "\x1b[35m", ConsoleColor.DarkCyan => "\x1b[36m", ConsoleColor.Gray => "\x1b[37m", ConsoleColor.Red => "\x1b[91m", ConsoleColor.Green => "\x1b[92m", ConsoleColor.Yellow => "\x1b[93m", ConsoleColor.Blue => "\x1b[94m", ConsoleColor.Magenta => "\x1b[95m", ConsoleColor.Cyan => "\x1b[96m", ConsoleColor.White => "\x1b[97m", _ => Reset }; } public ConsoleFormatter() : base(nameof(ConsoleFormatter)) { } public override void Write(in LogEntry logEntry, IExternalScopeProvider? scopeProvider, TextWriter textWriter) { var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var level = logEntry.LogLevel switch { LogLevel.Trace => "TRACE", LogLevel.Debug => "DEBUG", LogLevel.Information => "INFO", LogLevel.Warning => "WARN", LogLevel.Error => "ERROR", LogLevel.Critical => "CRIT", _ => "NONE", }; var category = logEntry.Category; var eventId = logEntry.EventId.Id; var eventName = logEntry.EventId.Name; var message = logEntry.Formatter?.Invoke(logEntry.State, logEntry.Exception); if (Console.IsOutputRedirected) { textWriter.WriteLine($"[{timestamp}] [{level}] [{category}] {message}"); } else { var levelColor = Ansi.Color(GetLogLevelColor(logEntry.LogLevel)); var categoryColor = Ansi.Color(ConsoleColor.Blue); textWriter.Write('['); textWriter.Write(timestamp); textWriter.Write("] ["); textWriter.Write(levelColor); textWriter.Write(level); textWriter.Write(Ansi.Reset); textWriter.Write("] ["); textWriter.Write(categoryColor); textWriter.Write(category); textWriter.Write(Ansi.Reset); textWriter.Write("] ["); textWriter.Write(eventId); textWriter.Write("] ["); textWriter.Write(eventName); textWriter.Write("] "); textWriter.WriteLine(message); } if (logEntry.Exception != null) { if (!Console.IsOutputRedirected) Console.ForegroundColor = ConsoleColor.DarkRed; textWriter.WriteLine(logEntry.Exception); if (!Console.IsOutputRedirected) Console.ResetColor(); } } private static void WriteColored(TextWriter writer, string text, ConsoleColor color) { var originalColor = Console.ForegroundColor; Console.ForegroundColor = color; writer.Write(text); Console.ForegroundColor = originalColor; } private static ConsoleColor GetLogLevelColor(LogLevel level) => level switch { LogLevel.Trace => ConsoleColor.DarkGray, LogLevel.Debug => ConsoleColor.Gray, LogLevel.Warning => ConsoleColor.Yellow, LogLevel.Error => ConsoleColor.Red, LogLevel.Critical => ConsoleColor.DarkRed, _ => Console.ForegroundColor }; }