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