using log4net; using log4net.Core; using Microsoft.Extensions.Logging.Log4Net.AspNetCore.Entities; using System; namespace Microsoft.Extensions.Logging { /// /// The log4net eventIdLogger class. /// public class Log4NetLogger : ILogger { private readonly IExternalScopeProvider externalScopeProvider; /// /// The log. /// private readonly IEventIDLog eventIdLogger; /// /// The provider options. /// private readonly Log4NetProviderOptions options; /// /// Initializes a new instance of the class. /// /// The log4net provider options. public Log4NetLogger(Log4NetProviderOptions options, IExternalScopeProvider externalScopeProvider) { this.options = options ?? throw new ArgumentNullException(nameof(options)); this.externalScopeProvider = externalScopeProvider ?? throw new ArgumentNullException(nameof(externalScopeProvider)); this.eventIdLogger = new EventIDLogImpl(LogManager.GetLogger(options.LoggerRepository, options.Name).Logger); } /// /// Gets the name. /// public string Name => this.eventIdLogger.Logger.Name; /// /// A get-only property for accessing the /// within the instance. /// internal Log4NetProviderOptions Options => this.options; /// /// Begins a logical operation scope. /// /// The type of the state. /// The identifier for the scope. /// /// An IDisposable that ends the logical operation scope on dispose. /// public IDisposable BeginScope(TState state) => externalScopeProvider.Push(state); /// /// Determines whether the logging level is enabled. /// /// The log level. /// The value indicating whether the logging level is enabled. /// Throws when is outside allowed range. public bool IsEnabled(LogLevel logLevel) { Level translatedLogLevel = this.options.LogLevelTranslator.TranslateLogLevel(logLevel, Options); if (translatedLogLevel != null) { return this.eventIdLogger.Logger.IsEnabledFor(translatedLogLevel); } if (logLevel == LogLevel.None) { return false; } throw new ArgumentOutOfRangeException(nameof(logLevel)); } /// /// Logs an exception into the log. /// /// The log level. /// The event Id. /// The state. /// The exception. /// The formatter. /// The type of the state. /// Throws when the is null. public void Log( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { if (!this.IsEnabled(logLevel)) { return; } EnsureValidFormatter(formatter); var candidate = new MessageCandidate(logLevel, eventId, state, exception, formatter); LoggingEvent loggingEvent = options.LoggingEventFactory.CreateLoggingEvent(in candidate, eventIdLogger.Logger, options, externalScopeProvider); if (loggingEvent == null) return; this.eventIdLogger.Log(eventId, loggingEvent); } private static void EnsureValidFormatter(Func formatter) { if (formatter == null) { throw new ArgumentNullException(nameof(formatter)); } } } }