using Microsoft.Extensions.Logging; using System; using System.Collections.Concurrent; using System.IO; using System.Threading; namespace HealthMonitor.WebApi.DbLog { public class EfCoreLogger : ILogger { private readonly string _categoryName; //protected static ConcurrentStack ScopeStack { get; } = new ConcurrentStack(); public EfCoreLogger(string categoryName) { _categoryName = categoryName; } public IDisposable BeginScope(TState state) { //ScopeStack.Push(state.ToString()); return new NoopDisposable(); } public bool IsEnabled(LogLevel logLevel) { return logLevel >= EfCoreLogProvider.LogThisAndAbout; } public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { switch (logLevel) { case LogLevel.Trace: case LogLevel.Debug: { var content = formatter(state, exception).Replace(Path.DirectorySeparatorChar, '\t'); Serilog.Log.Debug(content); } break; case LogLevel.Information: { var content = formatter(state, exception).Replace(Path.DirectorySeparatorChar, '\t'); Serilog.Log.Information(content); } break; case LogLevel.Warning: { var content = formatter(state, exception).Replace(Path.DirectorySeparatorChar, '\t'); Serilog.Log.Warning(content); } break; case LogLevel.Error: Serilog.Log.Error(formatter(state, exception)); break; case LogLevel.Critical: Serilog.Log.Fatal(formatter(state, exception)); break; } } private class NoopDisposable : IDisposable { public void Dispose() { //while (!ScopeStack.TryPop(out _)) //{ // Thread.Sleep(100); //} } } } }