using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; namespace Oqtane.Logging { internal class Logger : ILogger { public LoggerProvider Provider { get; private set; } public string Category { get; private set; } public Logger(LoggerProvider Provider, string Category) { this.Provider = Provider; this.Category = Category; } IDisposable ILogger.BeginScope(TState State) { return Provider.ScopeProvider.Push(State); } bool ILogger.IsEnabled(LogLevel LogLevel) { return Provider.IsEnabled(LogLevel); } void ILogger.Log(LogLevel LogLevel, EventId EventId, TState State, Exception Exception, Func Formatter) { if ((this as ILogger).IsEnabled(LogLevel)) { LogEntry logentry = new LogEntry(); // we need the TenantId and SiteId logentry.Category = this.Category; logentry.Level = LogLevel; logentry.Text = Exception?.Message ?? State.ToString(); logentry.Exception = Exception; logentry.EventId = EventId; logentry.State = State; if (State is string) { logentry.StateText = State.ToString(); } else if (State is IEnumerable> Properties) { logentry.StateProperties = new Dictionary(); foreach (KeyValuePair item in Properties) { logentry.StateProperties[item.Key] = item.Value; } } if (Provider.ScopeProvider != null) { Provider.ScopeProvider.ForEachScope((value, loggingProps) => { if (logentry.Scopes == null) { logentry.Scopes = new List(); } LogScope Scope = new LogScope(); logentry.Scopes.Add(Scope); if (value is string) { Scope.Text = value.ToString(); } else if (value is IEnumerable> props) { if (Scope.Properties == null) Scope.Properties = new Dictionary(); foreach (var pair in props) { Scope.Properties[pair.Key] = pair.Value; } } }, State); } Provider.WriteLog(logentry); } } } }