using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace Swan.Logging { /// /// Entry-point for logging. Use this static class to register/unregister /// loggers instances. By default, the ConsoleLogger is registered. /// public static class Logger { /*private static readonly Object SyncLock = new Object();*/ // [Obsolete("NEED", false)] private static readonly List Loggers = new List(); // [Obsolete("NEED", false)] private static UInt64 _loggingSequence; // [Obsolete("NEED", false)] static Logger() { if(Terminal.IsConsolePresent) { Loggers.Add(ConsoleLogger.Instance); } if(DebugLogger.IsDebuggerAttached) { Loggers.Add(DebugLogger.Instance); } } #region Extended Public API /// /// Logs an error message to the console's standard error. /// /// The ex. /// The source. /// The message. /// Name of the caller member. This is automatically populated. /// The caller file path. This is automatically populated. /// The caller line number. This is automatically populated. // [Obsolete("NEED", false)] public static void Log(this Exception ex, String source = null, String message = null, [CallerMemberName] String callerMemberName = "", [CallerFilePath] String callerFilePath = "", [CallerLineNumber] Int32 callerLineNumber = 0) => LogMessage(LogLevel.Error, message ?? ex.Message, source ?? ex.Source, ex, callerMemberName, callerFilePath, callerLineNumber); #endregion // [Obsolete("NEED", false)] private static void LogMessage(LogLevel logLevel, String message, String sourceName, Object extendedData, String callerMemberName, String callerFilePath, Int32 callerLineNumber) { UInt64 sequence = _loggingSequence; DateTime date = DateTime.UtcNow; _loggingSequence++; String loggerMessage = String.IsNullOrWhiteSpace(message) ? String.Empty : message.RemoveControlCharsExcept('\n'); LogMessageReceivedEventArgs eventArgs = new LogMessageReceivedEventArgs(sequence, logLevel, date, sourceName, loggerMessage, extendedData, callerMemberName, callerFilePath, callerLineNumber); foreach(ILogger logger in Loggers) { _ = Task.Run(() => { if(logger.LogLevel <= logLevel) { logger.Log(eventArgs); } }); } } } }