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