// namespace SafeCampus.Core; /// /// 日志写入文件的组件 /// public sealed class LoggingConsoleComponent : IServiceComponent { private readonly LoggingSetting _loggingSetting = App.GetConfig("Logging", true); private readonly string _monitorName = "System.Logging.LoggingMonitor"; public void Load(IServiceCollection services, ComponentContext componentContext) { services.AddConsoleFormatter(options => { options.MessageFormat = logMsg => { //如果不是LoggingMonitor日志或者开启了格式化才格式化 if (logMsg.LogName != _monitorName && _loggingSetting.MessageFormat) { var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("【日志级别】:" + logMsg.LogLevel); stringBuilder.AppendLine("【日志类名】:" + logMsg.LogName); stringBuilder.AppendLine("【日志时间】:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); stringBuilder.AppendLine("【日志内容】:" + logMsg.Message); if (logMsg.Exception != null) { stringBuilder.AppendLine("【异常信息】:" + logMsg.Exception); } return stringBuilder.ToString(); } return logMsg.Message; }; options.WriteHandler = (logMsg, scopeProvider, writer, fmtMsg, opt) => { if (logMsg.LogName == _monitorName && !_loggingSetting.Monitor.Console) return; var consoleColor = ConsoleColor.White; switch (logMsg.LogLevel) { case LogLevel.Information: consoleColor = ConsoleColor.DarkGreen; break; case LogLevel.Warning: consoleColor = ConsoleColor.DarkYellow; break; case LogLevel.Error: consoleColor = ConsoleColor.DarkRed; break; } writer.WriteWithColor(fmtMsg, ConsoleColor.Black, consoleColor); }; }); } } public static class TextWriterExtensions { private const string DEFAULT_FOREGROUND_COLOR = "\x1B[39m\x1B[22m"; private const string DEFAULT_BACKGROUND_COLOR = "\x1B[49m"; public static void WriteWithColor(this TextWriter textWriter, string message, ConsoleColor? background, ConsoleColor? foreground) { // Order: // 1. background color // 2. foreground color // 3. message // 4. reset foreground color // 5. reset background color var backgroundColor = background.HasValue ? GetBackgroundColorEscapeCode(background.Value) : null; var foregroundColor = foreground.HasValue ? GetForegroundColorEscapeCode(foreground.Value) : null; if (backgroundColor != null) { textWriter.Write(backgroundColor); } if (foregroundColor != null) { textWriter.Write(foregroundColor); } textWriter.WriteLine(message); if (foregroundColor != null) { textWriter.Write(DEFAULT_FOREGROUND_COLOR); } if (backgroundColor != null) { textWriter.Write(DEFAULT_BACKGROUND_COLOR); } } private static string GetForegroundColorEscapeCode(ConsoleColor color) { return 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[1m\x1B[31m", ConsoleColor.Green => "\x1B[1m\x1B[32m", ConsoleColor.Yellow => "\x1B[1m\x1B[33m", ConsoleColor.Blue => "\x1B[1m\x1B[34m", ConsoleColor.Magenta => "\x1B[1m\x1B[35m", ConsoleColor.Cyan => "\x1B[1m\x1B[36m", ConsoleColor.White => "\x1B[1m\x1B[37m", _ => DEFAULT_FOREGROUND_COLOR }; } private static string GetBackgroundColorEscapeCode(ConsoleColor color) { return color switch { ConsoleColor.Black => "\x1B[40m", ConsoleColor.DarkRed => "\x1B[41m", ConsoleColor.DarkGreen => "\x1B[42m", ConsoleColor.DarkYellow => "\x1B[43m", ConsoleColor.DarkBlue => "\x1B[44m", ConsoleColor.DarkMagenta => "\x1B[45m", ConsoleColor.DarkCyan => "\x1B[46m", ConsoleColor.Gray => "\x1B[47m", _ => DEFAULT_BACKGROUND_COLOR }; } }