簡體   English   中英

如何從我的ASP.NET Core MVC應用程序中的類庫記錄NLog調用?

[英]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並非如此。

  1. 您不需要單獨的配置文件。 如果您的ASP.net MVC核心項目具有nlog.config且在構建過程中成功復制,則在以下情況下將加載相同的配置

     private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 
  2. 確保正確復制了文件。 還必須在配置NLog.config中正確設置MinLevel。

  3. 確保您具有.NET Core ClassLibrary(僅確保它已成功加載)

  4. 在您的情況下,您也可以使用依賴注入,但這是不同的故事。

這是使用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"); } } 

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

類庫永遠不應依賴於特定的日志記錄實現。 相反,您應該使用一個稱為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.

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