如何从我的ASP.NET Core MVC应用程序中的类库记录NLog调用?

时间:2018-10-23 15:50:13

标签: c# asp.net-core .net-core asp.net-core-mvc nlog

假装我有两个项目。

第一个是 ASP.NET Core MVC项目,该项目依赖于NLog.Extensions.Logging进行日志记录。这很棒;我可以在控制器上使用依赖项注入来获取ILogger实例,并且nlog.config文件包含我的NLog配置。

第二个是API依赖的类库,它直接依赖NLog进行日志记录。它包含如下调用:

public class SampleClass
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    public void DoStuff()
    {
        if (_failed) Logger.Error("oh no");
    }
}

这些类通过一些反思性的向导实例化,我不能使用依赖注入来替换其记录器。您也可以将它们视为某种模型,无法在启动时实例化。


如何使我的库的日志显示在API的日志输出中?我希望它们会自动被nlog.config捕获,但似乎不会被捕获。

2 个答案:

答案 0 :(得分:4)

  1. 您不需要单独的配置文件。 如果您的ASP.net MVC核心项目具有nlog.config,并且在构建过程中成功复制,则在

    时将加载相同的配置
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
    
  2. 确保正确复制了文件。还要在配置NLog.config中正确设置MinLevel。

  3. 确保您具有.NET Core ClassLibrary(只是为了确保它已成功加载)

  4. 在您的情况下,您也可以使用依赖注入,但这与Story不同。

这是使用NLog的完整示例

  1. 您需要获取NLog和NLog.Web.AspnetCore软件包

  2. 在Program.cs中

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
         return  WebHost.CreateDefaultBuilder(args)
                    .ConfigureLogging(logging =>
                    {
                        logging.ClearProviders();
                        logging.SetMinimumLevel(LogLevel.Trace);
                    }).UseNLog()
                .UseStartup<Startup>();
        }
    
  3. 现在在ClassLibrary项目中,只需为NLog添加Referece。 注意:此处请确保ILogger来自Microsoft.Extensions.Logging,而不是来自NLog。

    public class Class1
    {
        //private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private ILogger<Class1> _logger = null;
        public Class1(ILogger<Class1> logger)
        {
            this._logger = logger;
        }
    
        public void DoStuff()
        {
            var _failed = true;
            if (_failed) _logger.LogError("oh no");
        }
    }
    

现在它也可以正常工作了。

答案 1 :(得分:0)

类库绝不应依赖于特定的日志记录实现。相反,您应该使用称为 facade 的抽象。 Microsoft.Extensions.Logging库是您可以使用的一种这样的外观,但是还有其他类似Common.Logging的库。无论如何,需要利用日志记录的类都应与此抽象日志记录外观一起注入。例如:

public class SampleClass
{
    private readonly ILogger _logger;

    public SampleClass(ILogger<SampleClass> logger)
    {
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }

    public void DoStuff()
    {
        if (_failed) _logger.LogError("oh no");
    }
}

然后,在您的Web应用程序或利用类库的任何其他具体应用程序中,实际上是在其中设置日志记录实现的位置,并通过DI容器对其进行注册,以将其注入到日志记录外观中。

总之,您的类库仅取决于您的日志记录外观,这使它可以一般调用诸如LogError之类的东西。使用您的库的应用程序将设置其实际的具体日志记录实现,然后幕墙将在幕后将其用于库的日志记录。