Microsoft.Extensions.Logging的记录器包装器的实现和使用

这个问题与史蒂文的答案有关 – 这里 。 他提出了一个非常好的记录器包装器。 我将在下面粘贴他的代码:

public interface ILogger { void Log(LogEntry entry); } public static class LoggerExtensions { public static void Log(this ILogger logger, string message) { logger.Log(new LogEntry(LoggingEventType.Information, message, null)); } public static void Log(this ILogger logger, Exception exception) { logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception)); } // More methods here. } 

所以,我的问题是创建代理Microsoft.Extensions.Logging的实现的正确方法什么,以及在代码中稍后使用它的最佳方法是什么

注意:此问题是关于log4net的此问题的副本,但现在特定于Microsoft.Extensions.Logging。

所以,我的问题是创建代理Microsoft.Extensions.ILogger的实现的正确方法是什么?

你应该创建类似的东西:

 public sealed class MicrosoftLoggingAdapter : ILogger { private readonly Microsoft.Extensions.ILogger adaptee; public MicrosoftLoggingAdapter (Microsoft.Extensions.ILogger adaptee) => this.adaptee = adaptee; public void Log(LogEntry e) => adaptee.Log(ToLevel(e.Severity), 0, e.Message, e.Exception, (s, _) => s); private static LogLevel ToLevel(LoggingEventType s) => s == LoggingEventType.Debug ? LogLevel.Debug : s == LoggingEventType.Information ? LogLevel.Information : s == LoggingEventType.Warning ? LogLevel.Warning : s == LoggingEventType.Error ? LogLevel.Error : LogLevel.Critical; } 

以后在代码中使用它的最佳方法是什么?

如果您使用的是DI容器,则只需使用DI容器将ILogger映射到MicrosoftLoggingAdapter 。 您还需要注册Microsoft.Extensions.ILogger ,或者只是将一个MS logger实例提供给DI容器,以将其注入MicrosoftLoggingAdapter构造函数。

如果您不使用DI容器,即使用Pure DI ,那么您可以执行以下操作:

 var logger = loggerFactory.CreateLogger("Application"); ILogger logging_adapter = new MicrosoftLoggingAdapter(logger); var myobject = new MyClass(other_dependencies_here, logging_adapter);