簡體   English   中英

NLog 適用於 ASP.NET Core App 但不適用於 .NET Core xUnit 測試項目

[英]NLog works in ASP.NET Core App but not in .NET Core xUnit Test Project

我創建了一個 .NET Core 類庫,它定義了實用程序類接口,並實現了每個接口,例如通過 ADO.NET 訪問數據庫等。

每個實現類都使用 NLog。 這在包含和引用 .NET Core 類庫的 ASP.NET Core Web 應用程序中非常有效。

但是,當我嘗試在 .NET Core xUnit Test 項目的上下文中實例化這些相同的實現類時,我得到

無法將“NLog.Logger”類型的對象轉換為“Microsoft.Extensions.Logging.ILogger”

我已經搜索過類似的問題,但沒有找到。

在每個類中,我都聲明了一個私有的只讀變量:

private readonly ILogger<DatabasePersistenceAdoDotNet> _logger = null;

我正在像這樣實例化這個變量:

_logger = (ILogger<DatabasePersistenceAdoDotNet>)NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

這適用於包含並引用 .NET Core 類庫的 ASP.NET Core Web 應用程序,但在我的 .NET Core xUnit Test 項目中失敗了。

我懷疑這與 ASP.NET 的依賴注入在 .NET Core xUnit Test 項目中不可用有關,但我不知道如何使我的實用程序包在這兩種情況下都能正常工作。

在 ASP.NET Core 中使用 NLog 時,有兩種樣式:

  1. 非 DI 樣式,使用GetCurrentClassLogger()
  2. DI 風格,它需要 NLog.Extensions.Logging / NLog.Web.AspNetCore 包在 NLog 和 Microsoft.Extensions.Logging 之間架起橋梁。

使用.GetCurrentClassLogger() ,您將獲得一個 NLog 記錄器對象(它實現NLog.ILogger ,而不是Microsoft.Extensions.Logging.ILogger )。

因此,如果您需要Microsoft.Extensions.Logging.ILogger ,則不能使用.GetCurrentClassLogger() 你需要:

  1. 自己設置整個 DI 系統並構造函數注入Microsoft.Extensions.Logging.ILogger ,或
  2. 使用 NLog.Extensions.Logging 包的類。

選項 2 是一種簡單的方法,我將向您展示如何:

// Load NLog
NLog.Web.NLogBuilder.ConfigureNLog("nlog.config");

// Create provider to bridge Microsoft.Extensions.Logging
var provider = new NLog.Extensions.Logging.NLogLoggerProvider();

// Create logger
Microsoft.Extensions.Logging.ILogger logger = provider.CreateLogger(typeof(MyClass).FullName);

請注意,您不能以這種方式創建Microsoft.Extensions.Logging.ILogger<MyClass> 只是一個非通用的Microsoft.Extensions.Logging.ILogger 如果您需要通用版本,那么您需要 DI 設置,這將處理兩者之間的轉換。

NLog.config 和測試項目

也很高興知道,在測試項目中找到 nlog.config 很難,因為單元測試框架會移動二進制文件等。我建議使用 config API

例如

var configuration = new LoggingConfiguration();
configuration.AddRuleForAllLevels(new ConsoleTarget());
LogManager.Configuration = configuration;

或者

var configuration = XmlLoggingConfiguration.CreateFromXmlString("<nlog>....</nlog>"); //full nlog.config as string
LogManager.Configuration = configuration;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM