forked from amkovkov/GranuSightSoftware2
112 lines
3.8 KiB
C#
112 lines
3.8 KiB
C#
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
namespace GSS2.Test.Logging;
|
|
|
|
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<TState>(in LogEntry<TState> 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
|
|
};
|
|
}
|