[英]How to log NLog calls from a class library in my ASP.NET Core MVC app?
假設我有兩個項目。
第一個是依靠NLog.Extensions.Logging
進行日志記錄的ASP.NET Core MVC項目 。 這很棒; 我可以在控制器上使用依賴項注入來獲取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
捕獲,但nlog.config
並非如此。
您不需要單獨的配置文件。 如果您的ASP.net MVC核心項目具有nlog.config且在構建過程中成功復制,則在以下情況下將加載相同的配置
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
確保正確復制了文件。 還必須在配置NLog.config中正確設置MinLevel。
確保您具有.NET Core ClassLibrary(僅確保它已成功加載)
在您的情況下,您也可以使用依賴注入,但這是不同的故事。
這是使用NLog的完整示例
您需要獲取NLog和NLog.Web.AspnetCore軟件包
在Program.cs中
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { return WebHost.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); }).UseNLog() .UseStartup<Startup>(); }
現在在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"); } }
現在它也可以正常工作了。
類庫永遠不應依賴於特定的日志記錄實現。 相反,您應該使用一個稱為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
東西。 使用您的庫的應用程序將設置其實際的具體日志記錄實現,然后幕牆將在幕后將其用於庫所做的日志記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.