2019-12-09 17:25:54 +01:00
|
|
|
|
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 {
|
2019-12-10 20:01:19 +01:00
|
|
|
|
/*private static readonly Object SyncLock = new Object();*/
|
|
|
|
|
// [Obsolete("NEED", false)]
|
2019-12-09 17:25:54 +01:00
|
|
|
|
private static readonly List<ILogger> Loggers = new List<ILogger>();
|
|
|
|
|
|
2019-12-10 20:01:19 +01:00
|
|
|
|
// [Obsolete("NEED", false)]
|
2019-12-09 17:25:54 +01:00
|
|
|
|
private static UInt64 _loggingSequence;
|
|
|
|
|
|
2019-12-10 20:01:19 +01:00
|
|
|
|
// [Obsolete("NEED", false)]
|
2019-12-09 17:25:54 +01:00
|
|
|
|
static Logger() {
|
|
|
|
|
if(Terminal.IsConsolePresent) {
|
|
|
|
|
Loggers.Add(ConsoleLogger.Instance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(DebugLogger.IsDebuggerAttached) {
|
|
|
|
|
Loggers.Add(DebugLogger.Instance);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-10 20:20:45 +01:00
|
|
|
|
#region Extended Public API
|
2019-12-09 17:25:54 +01:00
|
|
|
|
|
|
|
|
|
/// <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>
|
2019-12-10 20:01:19 +01:00
|
|
|
|
// [Obsolete("NEED", false)]
|
2019-12-09 17:25:54 +01:00
|
|
|
|
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);
|
|
|
|
|
|
2019-12-10 20:20:45 +01:00
|
|
|
|
#endregion
|
2019-12-09 17:25:54 +01:00
|
|
|
|
|
2019-12-10 20:01:19 +01:00
|
|
|
|
// [Obsolete("NEED", false)]
|
2019-12-09 17:25:54 +01:00
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|