| @@ -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<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> 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>(TState state) | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| } | |||
| } | |||
| @@ -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<ILoggerProvider> Providers { get; } = new List<ILoggerProvider>(); | |||
| 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); | |||
| } | |||
| } | |||
| } | |||
| @@ -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; | |||
| } | |||
| } | |||
| } | |||