NLog的依赖注入

Ste*_*bob 8 logging dependency-injection nlog asp.net-core

我有一个.Net核心Web应用程序,我正在尝试通过NLog添加日志记录.在以前的项目中,我刚刚在每个类的顶部使用了类似下面的内容:

private static Logger logger = LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)

我试图在可能的情况下遵循这个项目的更多最佳实践.

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

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

services.AddScoped<BLL.Logging.NLogLogger>();
Run Code Online (Sandbox Code Playgroud)

目前,NLogLogger该类创建了一个NLog Logger的实例GetCurrentClassLogger(),当使用它时,它只会将名称报告为"BLL.Logging.NLogLogger"而不是记录器注入的实际类.

为了简化问题并使其更具通用性:如何传递.Net Core将要注入类的类的名称?

我已经考虑过类似下面的内容,但不知道如何实现它:

services.AddScoped<BLL.Logging.NLogLogger>(serviceProvider => new BLL.Logging.NLogLogger("class name here"));
Run Code Online (Sandbox Code Playgroud)

Set*_*Set 8

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

public class TodoController : Controller
{
    private readonly ILogger _logger;

    public TodoController(ILogger<TodoController> logger)
    {
        _logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*bob 7

我想我已经找到了一个可以接受的解决方案,虽然不完全是我问这个问题的方式.

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

的LoggerFactory:

public class LoggerFactory : ILoggerFactory
{
    public ILogger GetLogger(string fullyQualifiedClassName)
    {
        return new NLogLogger(fullyQualifiedClassName);
    }
}
Run Code Online (Sandbox Code Playgroud)

NLogLogger:

public class NLogLogger : ILogger, INLogLogger
{
    NLog.Logger mylogger;
    public NLogLogger(string fullyQualifiedClassName)
    {
        mylogger = NLog.LogManager.GetLogger(fullyQualifiedClassName);
    }
}
Run Code Online (Sandbox Code Playgroud)

Startup.cs:

services.AddScoped<BLL.Logging.ILoggerFactory>();
Run Code Online (Sandbox Code Playgroud)

在我的控制器类中,我得到了:

    private BLL.Logging.ILogger logger;//my NLogLogger inherits this interface

    public HomeController(BLL.Logging.ILoggerFactory loggerFactory)
    {
        logger = loggerFactory.GetLogger(this.GetType().FullName);
    }
Run Code Online (Sandbox Code Playgroud)

所以我现在已经有效地完成了,而不是注入实际的Logger本身(@Steven表示不可能像我尝试的那样),我已经注入了实用程序来创建一个logger实例包裹NLog.

我仍然有责任在类中创建记录器,但至少我已经与底层日志框架(NLog)分离.

  • 这真的不是你想要的!看起来您现在在控制器中有 NLog 的引用,并且您正在分解 Microsoft Logging 接口。 (4认同)
  • @SteveRakebrandt OP正在要求* NLog *记录器的DI。因此,就回答该问题而言,这比已接受的答案更像是一种解决方案。而且恕我直言,坚持使用MS Logging接口没有任何好处。如果您选择该框架,并且不想让记录器塞入通用的MS界面中而被忽略,则`NLog`具有良好的功能。 (3认同)