关于日志记录:NLog依赖注入

Dependency Injection wth NLog

我有一个.NET Core Web应用程序,我正在尝试通过NLog向其中添加日志记录。
在以前的项目中,我只是在每个类的顶部使用以下内容:

1
private static Logger logger = LogManager.GetCurrentClassLogger();

我正在尝试尽可能多地遵循此项目的最佳做法。

我的问题是,我该如何注入一个记录器,该记录器具有要注入的类的完全限定名称?

到目前为止,在我的startup.cs文件中,我具有以下内容:

1
services.AddScoped<BLL.Logging.NLogLogger>();

此刻,NLogLogger类通过GetCurrentClassLogger()创建一个NLog Logger的实例,该实例使用时将仅报告名称为" BLL.Logging.NLogLogger",而不是记录器所使用的实际类。被注入。

为简化问题并使之更加通用:
如何传递.NET Core将注入类的类的名称?

我已经考虑过类似以下的内容,但不确定如何实现:

1
services.AddScoped<BLL.Logging.NLogLogger>(serviceProvider => new BLL.Logging.NLogLogger("class name here"));


使用DI指定ILogger<T>类型而不是Logger,其中T是使用记录器的类类型,因此NLog会知道该类。例如:

1
2
3
4
5
6
7
8
9
public class TodoController : Controller
{
    private readonly ILogger _logger;

    public TodoController(ILogger<TodoController> logger)
    {
        _logger = logger;
    }
}

参考文献:

  • ASP.NET Core入门(csproj vs2017)
  • ASP.NET Core 2入门
  • ASP.NET Core 3入门


我想我已经找到了一个可以接受的解决方案,尽管不完全是我提出问题的方式。

首先,我创建一个" LoggerFactory",它具有一个称为" GetLogger"的方法(该方法创建具体的NLog Logger并接受类名作为参数),然后直接注入该工厂而不是记录器。

LoggerFactory:

1
2
3
4
5
6
7
public class LoggerFactory : ILoggerFactory
{
    public ILogger GetLogger(string fullyQualifiedClassName)
    {
        return new NLogLogger(fullyQualifiedClassName);
    }
}

NLogLogger:

1
2
3
4
5
6
7
8
public class NLogLogger : ILogger, INLogLogger
{
    NLog.Logger mylogger;
    public NLogLogger(string fullyQualifiedClassName)
    {
        mylogger = NLog.LogManager.GetLogger(fullyQualifiedClassName);
    }
}

Startup.cs:

1
services.AddScoped<BLL.Logging.ILoggerFactory>();

在我的控制器类中,我有:

1
2
3
4
5
6
    private BLL.Logging.ILogger logger;//my NLogLogger inherits this interface

    public HomeController(BLL.Logging.ILoggerFactory loggerFactory)
    {
        logger = loggerFactory.GetLogger(this.GetType().FullName);
    }

所以我现在有效地做的是,而不是注入实际的Logger本身(这表明@Steven不可能以我尝试的方式进行),而是注入了实用程序来创建实例包装NLog的记录器的说明。

我仍然有责任在类中创建记录器,但是至少我已经与基础记录框架(NLog)分离了。