【问题标题】:How to inject named logger generic ILogger<T> as ILogger into constructor using IServiceCollection and NLog如何使用 IServiceCollection 和 NLog 将命名记录器泛型 ILogger<T> 作为 ILogger 注入构造函数
【发布时间】:2021-04-19 20:18:24
【问题描述】:

我想将ILogger&lt;MyClass&gt; 的泛型实现注入MyClass 的构造函数,而不使用其泛型参数。

例子:

public class MyClass
{
  private readonly ILogger _logger;

  // Inject ILogger<MyClass> as type ILogger
  public MyClass(ILogger logger) 
  {
    _logger = logger;
  }
}

我基本上不想每次都编写它的泛型类型,而是希望它自动解决。使用 autofac 我已经能够解决这个问题,但由于一些限制,它无法使用 autofac。

     services.AddLogging(configure =>
     {
       configure.ClearProviders();
       configure.SetMinimumLevel(LogLevel.Trace);
       configure.AddNLog();
     });

【问题讨论】:

    标签: c# .net-core dependency-injection nlog


    【解决方案1】:

    ILogger 来自依赖注入系统,它使用泛型类型为记录器对象注入正确的记录器名称(来自泛型类型的 NameSpace.ClassName)。

    你可以这样做:

    public class MyClass
    {
      private readonly ILogger _logger;   // Notice no generic
    
      public MyClass(ILogger<MyClass> logger) 
      {
        _logger = logger;
        _logger.LogInformation("Hello");
      }
    }
    

    或者你可以这样做:

    public class MyClass
    {
      private readonly ILogger _logger;   // Notice no generic
    
      public MyClass(ILoggerFactory loggerFactory) 
      {
        _logger = loggerFactory.CreateLogger(GetType().ToString());  // Performance hit
        _logger.LogInformation("Hello");
      }
    }
    

    如果你不喜欢 MEL-ILogger,那么你可以直接使用 NLog-Logger:

    public class MyClass
    {
      private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    
      public MyClass() 
      {
        Logger.Info("Hello");
      }
    }
    

    另请参阅:https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-GetCurrentClassLogger-and-Microsoft-ILogger

    【讨论】:

      猜你喜欢
      • 2022-08-22
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2020-07-28
      • 2018-12-23
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多