using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace ASC.Common.Logging { [Singletone] public class EFLoggerFactory : ILoggerFactory { Lazy Logger { get; set; } ILoggerProvider LoggerProvider { get; set; } public EFLoggerFactory(EFLoggerProvider loggerProvider) { LoggerProvider = loggerProvider; Logger = new Lazy(() => LoggerProvider.CreateLogger("")); } public void AddProvider(ILoggerProvider provider) { //LoggerProvider = provider; } public ILogger CreateLogger(string categoryName) { return Logger.Value; } public void Dispose() { } } [Singletone] public class EFLoggerProvider : ILoggerProvider { private IOptionsMonitor Option { get; } public EFLoggerProvider(IOptionsMonitor option) { Option = option; } public ILogger CreateLogger(string categoryName) { return new EFLogger(Option.Get("ASC.SQL")); } public void Dispose() { } } public class EFLogger : ILogger { public ILog CustomLogger { get; } public EFLogger(ILog customLogger) { CustomLogger = customLogger; } public IDisposable BeginScope(TState state) { return null; } public bool IsEnabled(LogLevel logLevel) { return logLevel switch { LogLevel.Trace => CustomLogger.IsTraceEnabled, LogLevel.Information => CustomLogger.IsInfoEnabled, LogLevel.None => false, LogLevel.Debug => CustomLogger.IsDebugEnabled, LogLevel.Warning => CustomLogger.IsWarnEnabled, LogLevel.Error => CustomLogger.IsErrorEnabled, LogLevel.Critical => CustomLogger.IsErrorEnabled, _ => true, }; } public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { switch (eventId.Id) { //case 20000: // CustomLogger.Debug(formatter(state, exception)); // break; case 20101: var keyValuePairs = state as IEnumerable>; CustomLogger.DebugWithProps("", keyValuePairs); break; } } } }