RaspberryIO_26/Swan.Tiny/Logging/Logger.cs
2019-12-10 20:20:45 +01:00

66 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace Swan.Logging {
/// <summary>
/// Entry-point for logging. Use this static class to register/unregister
/// loggers instances. By default, the <c>ConsoleLogger</c> is registered.
/// </summary>
public static class Logger {
/*private static readonly Object SyncLock = new Object();*/
// [Obsolete("NEED", false)]
private static readonly List<ILogger> Loggers = new List<ILogger>();
// [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
/// <summary>
/// Logs an error message to the console's standard error.
/// </summary>
/// <param name="ex">The ex.</param>
/// <param name="source">The source.</param>
/// <param name="message">The message.</param>
/// <param name="callerMemberName">Name of the caller member. This is automatically populated.</param>
/// <param name="callerFilePath">The caller file path. This is automatically populated.</param>
/// <param name="callerLineNumber">The caller line number. This is automatically populated.</param>
// [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);
}
});
}
}
}
}