| @@ -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; | |||||
| } | |||||
| } | |||||
| } | |||||