From 78f0fe40d24254fe1a4b4b638067cfc6844b6a7e Mon Sep 17 00:00:00 2001 From: Waterball Date: Mon, 1 Feb 2021 17:48:42 +0000 Subject: [PATCH] Definitely not stealing --- src/Discord.Net.Core/Logging/DefaultLogger.cs | 54 +++++++++++++++++++ .../Logging/DefaultLoggerFactory.cs | 41 ++++++++++++++ .../Logging/DefaultLoggerProvider.cs | 31 +++++++++++ 3 files changed, 126 insertions(+) create mode 100644 src/Discord.Net.Core/Logging/DefaultLogger.cs create mode 100644 src/Discord.Net.Core/Logging/DefaultLoggerFactory.cs create mode 100644 src/Discord.Net.Core/Logging/DefaultLoggerProvider.cs diff --git a/src/Discord.Net.Core/Logging/DefaultLogger.cs b/src/Discord.Net.Core/Logging/DefaultLogger.cs new file mode 100644 index 000000000..976d12339 --- /dev/null +++ b/src/Discord.Net.Core/Logging/DefaultLogger.cs @@ -0,0 +1,54 @@ +using Microsoft.Extensions.Logging; +using System; + +namespace Discord.Logging +{ + internal class DefaultLogger : ILogger + { + private static readonly object _lock = new object(); + + private LogLevel MinimumLevel { get; } + + internal DefaultLogger(LogLevel minLevel = LogLevel.Information) + { + this.MinimumLevel = minLevel; + } + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + if (!this.IsEnabled(logLevel)) + return; + + lock (_lock) + { + var ename = eventId.Name; + ename = ename?.Length > 12 ? ename?.Substring(0, 12) : ename; + Console.Write($"[{DateTimeOffset.Now}] [{eventId.Id,-4}/{ename,-12}] "); + + Console.Write(logLevel switch + { + LogLevel.Trace => "[Trace] ", + LogLevel.Debug => "[Debug] ", + LogLevel.Information => "[Info ] ", + LogLevel.Warning => "[Warn ] ", + LogLevel.Error => "[Error] ", + LogLevel.Critical => "[Crit ]", + LogLevel.None => "[None ] ", + _ => "[?????] " + }); + + var message = formatter(state, exception); + Console.WriteLine(message); + if (exception != null) + Console.WriteLine(exception); + } + } + + public bool IsEnabled(LogLevel logLevel) => logLevel >= this.MinimumLevel; + + public IDisposable BeginScope(TState state) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Discord.Net.Core/Logging/DefaultLoggerFactory.cs b/src/Discord.Net.Core/Logging/DefaultLoggerFactory.cs new file mode 100644 index 000000000..39f4e2a13 --- /dev/null +++ b/src/Discord.Net.Core/Logging/DefaultLoggerFactory.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Discord.Logging +{ + internal class DefaultLoggerFactory : ILoggerFactory + { + private List Providers { get; } = new List(); + private bool _isDisposed = false; + + public void Dispose() + { + if (this._isDisposed) + return; + this._isDisposed = true; + + foreach (var provider in this.Providers) + provider.Dispose(); + + this.Providers.Clear(); + } + + public ILogger CreateLogger(string categoryName) + { + if (this._isDisposed) + throw new InvalidOperationException("This logger factory is already disposed."); + + // HEHEHE XDXD + var provider = Providers.FirstOrDefault(); + + return provider?.CreateLogger(categoryName) ?? throw new ArgumentNullException(nameof(provider)); + } + + public void AddProvider(ILoggerProvider provider) + { + this.Providers.Add(provider); + } + } +} diff --git a/src/Discord.Net.Core/Logging/DefaultLoggerProvider.cs b/src/Discord.Net.Core/Logging/DefaultLoggerProvider.cs new file mode 100644 index 000000000..73391ef4b --- /dev/null +++ b/src/Discord.Net.Core/Logging/DefaultLoggerProvider.cs @@ -0,0 +1,31 @@ +using Microsoft.Extensions.Logging; +using System; + +namespace Discord.Logging +{ + internal class DefaultLoggerProvider : ILoggerProvider + { + private LogLevel MinimumLevel { get; } + + private bool _isDisposed = false; + + + internal DefaultLoggerProvider(LogLevel minLevel = LogLevel.Information) + { + this.MinimumLevel = minLevel; + } + + public ILogger CreateLogger(string categoryName) + { + if (this._isDisposed) + throw new InvalidOperationException("This logger provider is already disposed."); + + return new DefaultLogger(this.MinimumLevel); + } + + public void Dispose() + { + this._isDisposed = true; + } + } +}