diff --git a/Logger.cs b/Logger.cs index 0ea48dc..e688bf8 100644 --- a/Logger.cs +++ b/Logger.cs @@ -70,148 +70,72 @@ public class Logger : ILogger { try { - if (_loggerObjects.LogsToPost.Count == 0) + while (_loggerObjects.LogsToPost.Count == 0) { Thread.Sleep(10); - continue; } - foreach (var b in _loggerObjects.LogsToPost.ToList()) + for (int i = 0; i < _loggerObjects.LogsToPost.Count; i++) { - if (b == null || b.Message == null) + var currentLog = _loggerObjects.LogsToPost.First(); + _loggerObjects.LogsToPost.Remove(currentLog); + + if (currentLog is null || currentLog.Message is null) { LogWarn($"Missed log message due to garbage collection"); - _loggerObjects.LogsToPost.Remove(b); + _loggerObjects.LogsToPost.Remove(currentLog); continue; } - string LogLevelText = b.LogLevel.ToString(); + string LogLevelText = currentLog.LogLevel.ToString(); if (LogLevelText.Length < 6) LogLevelText += new string(' ', 6 - LogLevelText.Length); - ConsoleColor LogLevelColor = ConsoleColor.Gray; + ConsoleColor LogLevelColor; + ConsoleColor BackgroundColor; - LogLevelColor = b.LogLevel switch + LogLevelColor = currentLog.LogLevel switch { + LoggerObjects.LogLevel.TRACE => ConsoleColor.DarkGray, + LoggerObjects.LogLevel.DEBUG2 => ConsoleColor.DarkGray, LoggerObjects.LogLevel.DEBUG => ConsoleColor.Gray, LoggerObjects.LogLevel.INFO => ConsoleColor.Green, LoggerObjects.LogLevel.WARN => ConsoleColor.Yellow, LoggerObjects.LogLevel.ERROR => ConsoleColor.Red, - LoggerObjects.LogLevel.FATAL => ConsoleColor.DarkRed, + LoggerObjects.LogLevel.FATAL => ConsoleColor.Black, _ => ConsoleColor.Gray }; - string LogMessage = b.Message; + BackgroundColor = currentLog.LogLevel switch + { + LoggerObjects.LogLevel.FATAL => ConsoleColor.DarkRed, + _ => ConsoleColor.Black + }; + + string LogMessage = currentLog.Message; foreach (var blacklistobject in _loggerObjects.Blacklist) LogMessage = LogMessage.Replace(blacklistobject, new String('*', blacklistobject.Length), StringComparison.CurrentCultureIgnoreCase); - if (b.LogLevel == LoggerObjects.LogLevel.TRACE) + if (maxLogLevel >= currentLog.LogLevel) { - if (maxLogLevel == LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); + Console.ResetColor(); Console.Write($"[{currentLog.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); + Console.ForegroundColor = LogLevelColor; Console.BackgroundColor = BackgroundColor; Console.Write($"[{LogLevelText}]"); + Console.ResetColor(); Console.WriteLine($" {LogMessage}"); - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else if (b.LogLevel == LoggerObjects.LogLevel.DEBUG2) - { - if (maxLogLevel is LoggerObjects.LogLevel.DEBUG2 or LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else if (b.LogLevel == LoggerObjects.LogLevel.DEBUG) - { - if (maxLogLevel is LoggerObjects.LogLevel.DEBUG or LoggerObjects.LogLevel.DEBUG2 or LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else if (b.LogLevel == LoggerObjects.LogLevel.INFO) - { - if (maxLogLevel is LoggerObjects.LogLevel.DEBUG or LoggerObjects.LogLevel.INFO or LoggerObjects.LogLevel.DEBUG2 or LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else if (b.LogLevel == LoggerObjects.LogLevel.WARN) - { - if (maxLogLevel is LoggerObjects.LogLevel.DEBUG or LoggerObjects.LogLevel.INFO or LoggerObjects.LogLevel.WARN or LoggerObjects.LogLevel.DEBUG2 or LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else if (b.LogLevel == LoggerObjects.LogLevel.ERROR) - { - if (maxLogLevel is LoggerObjects.LogLevel.DEBUG or LoggerObjects.LogLevel.INFO or LoggerObjects.LogLevel.WARN or LoggerObjects.LogLevel.ERROR or LoggerObjects.LogLevel.DEBUG2 or LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else if (b.LogLevel == LoggerObjects.LogLevel.FATAL && maxLogLevel >= LoggerObjects.LogLevel.FATAL) - { - if (maxLogLevel is LoggerObjects.LogLevel.DEBUG or LoggerObjects.LogLevel.INFO or LoggerObjects.LogLevel.WARN or LoggerObjects.LogLevel.ERROR or LoggerObjects.LogLevel.FATAL or LoggerObjects.LogLevel.DEBUG2 or LoggerObjects.LogLevel.TRACE) - { - Console.ResetColor(); - Console.ForegroundColor = ConsoleColor.Black; Console.BackgroundColor = LogLevelColor; Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.Write($"[{LogLevelText}]"); - Console.ResetColor(); Console.WriteLine($" {LogMessage}"); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); - } - } - else - { - Console.ResetColor(); Console.Write($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] "); - Console.ForegroundColor = LogLevelColor; Console.Write($"[{LogLevelText}] "); - Console.ResetColor(); Console.WriteLine(LogMessage); - - if (b.Exception is not null) - Console.WriteLine(b.Exception.ToString()); + if (currentLog.Exception is not null) + Console.WriteLine(currentLog.Exception.ToString()); } _ = Task.Run(() => { - LogRaised?.Invoke(null, new LogMessageEventArgs() { LogEntry = b }); + LogRaised?.Invoke(null, new LogMessageEventArgs() { LogEntry = currentLog }); }); - _loggerObjects.LogsToPost.Remove(b); - try { - Byte[] FileWrite = Encoding.UTF8.GetBytes($"[{b.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] [{LogLevelText}] {LogMessage}\n{(b.Exception is not null ? $"{b.Exception.ToString()}\n" : "")}"); + Byte[] FileWrite = Encoding.UTF8.GetBytes($"[{currentLog.TimeOfEvent:dd.MM.yyyy HH:mm:ss}] [{LogLevelText}] {LogMessage}\n{(currentLog.Exception is not null ? $"{currentLog.Exception}\n" : "")}"); if (OpenedFile != null) { await OpenedFile.WriteAsync(FileWrite.AsMemory(0, FileWrite.Length)); @@ -222,25 +146,17 @@ public class Logger : ILogger { LogFatal($"Couldn't write log to file: {ex}"); } - - GC.KeepAlive(b); - GC.KeepAlive(b.LogLevel); - GC.KeepAlive(b.Message); - GC.KeepAlive(b.TimeOfEvent); } } catch (Exception ex) { - Console.ResetColor(); Console.Write($"[{DateTime.Now:dd.MM.yyyy HH:mm:ss} | ??] "); - Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write($"[FATAL] "); - Console.ResetColor(); Console.WriteLine($"An error occured while logging: {ex}"); + LogError("An exception occured while trying to display a log message", ex); await Task.Delay(1000); continue; } } }); - GC.KeepAlive(_loggerObjects.LogsToPost); return new Logger(); } @@ -290,6 +206,60 @@ public class Logger : ILogger + /// + /// Log with none log level + /// + /// + /// + public static void LogNone(string message, Exception? exception = null) + { + _loggerObjects.LogsToPost.Add(new LoggerObjects.LogEntry + { + TimeOfEvent = DateTime.Now, + LogLevel = LoggerObjects.LogLevel.NONE, + Message = message, + Exception = exception + }); + } + + + + /// + /// Log with trace log level + /// + /// + /// + public static void LogTrace(string message, Exception? exception = null) + { + _loggerObjects.LogsToPost.Add(new LoggerObjects.LogEntry + { + TimeOfEvent = DateTime.Now, + LogLevel = LoggerObjects.LogLevel.TRACE, + Message = message, + Exception = exception + }); + } + + + + /// + /// Log with debug2 log level + /// + /// + /// + public static void LogDebug2(string message, Exception? exception = null) + { + _loggerObjects.LogsToPost.Add(new LoggerObjects.LogEntry + { + TimeOfEvent = DateTime.Now, + LogLevel = LoggerObjects.LogLevel.DEBUG2, + Message = message, + Exception = exception + }); + } + + + /// /// Log with debug log level /// @@ -409,11 +379,15 @@ public class Logger : ILogger }); } + + public bool IsEnabled(Microsoft.Extensions.Logging.LogLevel logLevel) { return loggerStarted; } + + public IDisposable BeginScope(TState state) { return default!; diff --git a/LoggerObjects.cs b/LoggerObjects.cs index 264f37c..3f3e147 100644 --- a/LoggerObjects.cs +++ b/LoggerObjects.cs @@ -15,13 +15,13 @@ public class LoggerObjects public enum LogLevel { + NONE, FATAL, ERROR, WARN, INFO, DEBUG, DEBUG2, - TRACE, - NONE + TRACE } } diff --git a/LoggerProvider.cs b/LoggerProvider.cs index dbfbd7e..ac8a673 100644 --- a/LoggerProvider.cs +++ b/LoggerProvider.cs @@ -16,5 +16,9 @@ public class LoggerProvider : ILoggerProvider return _loggers.GetOrAdd(categoryName, name => new Logger()); } - public void Dispose() => _loggers.Clear(); + public void Dispose() + { + _loggers.Clear(); + GC.SuppressFinalize(this); + } }