簡體   English   中英

.NET Standard 類庫中的日志消息

[英]Log messages from .NET Standard class library

我有一個包含 ASP.NET Core (2.1.5) Web API 項目的解決方案,該項目引用了幾個 .NET Standard 2.0 類庫項目。

我想為我的應用程序實現一些日志記錄,並且我已經使用NLog為 Web API 項目完成了這項工作(實際上,它可以是任何實現 ILogger 的提供程序)。 為此,我在Program.cs 中定義了一個靜態字段,該字段在運行時初始化並使用WebHostBuilderExtensions.ConfigureLogging對其進行配置:

using Microsoft.Extensions.Logging;

public class Program
{
    private static readonly Logger logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
    // other content ...
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    var webHost = WebHost.CreateDefaultBuilder(args)
        .UseStartup(typeof(Startup).GetTypeInfo().Assembly.FullName)
        .ConfigureLogging(builder =>
        {
            builder.ClearProviders();
            builder.SetMinimumLevel(LogLevel.Information);
        })
        .UseNLog();
    // other content ...
}   

這使我可以在需要時在 ASP.NET Core 應用程序中的每個類中使用ILogging 的DI:

using Microsoft.Extensions.Logging;

public class Startup
{
    public IConfiguration Configuration { get; }
    private readonly ILogger<Startup> _logger;

    public Startup(IConfiguration configuration, ILogger<Startup> logger)
    {
        Configuration = configuration;
        _logger = logger;
    }
}

但是現在我完全對為我的類庫設置日志感到困惑。 我可以想象的選項之一是使用 DI 機制來允許我的庫調用相同的ILogger接口,如下所示:

using Microsoft.Extensions.Logging;

public class MyLibraryClass
{
    private ILogger<MyLibraryClass> _logger;

    public MyLibraryClass(ILogger<MyLibraryClass> logger)
    {
        _logger = logger;
    }

    public void SomeLibraryMethod()
    {
        _logger.LogInformation("Some library method logging here...);
    }
}

但這看起來很尷尬,因為我需要為我需要記錄的所有庫類(可以說,所有類)注入此依賴項。

我還為每個庫項目考慮了一些靜態類,其中此依賴項僅注入一次,以便靜態類可以充當ILogger的包裝器。 或者甚至將 NLog 從 WebAPI 項目移動到其中一個庫(甚至創建一個單獨的庫)並使用它從所有其他項目調用這個庫。 但正如這里所建議的,最好為每個類都有一個單獨的ILogger實例來過濾不同的記錄器。 或者也許為某個項目創建靜態記錄器就足夠了?

我的另一個擔憂是 ILogger 的此類靜態包裝器需要我定義自己的接口來處理日志消息。 ILogger本身就是一個精心設計的界面,這種態度似乎是某種雙重工作。

我已經瀏覽了很多分步指南,但其中大部分都描述了如何僅為一個 ASP.NET Core Web 應用程序配置日志記錄(或者很可能,我使用了錯誤的搜索關鍵字)。 無論如何,我此時卡住了,不知道讓我的庫使用與我的主 WebAPI 應用程序相同的日志記錄提供程序和文件的正確方法。 也許,我錯過了一些眾所周知的做法?

我不認為這很尷尬Microsoft.Extensions.Logging.ILogger是大多數日志庫實現的通用接口。

在這種情況下使用單例會將您綁定到特定的日志庫,這對於小型項目或POC項目來說可能很好,但想象一下跨團隊共享您的庫或發布它。 期望接口更方便。

至於如何將您選擇的日志庫注入您的類庫,您不必擔心它,因為它由DI系統負責。

您只需要在一個Web項目類中將您的類聲明為構造函數依賴項。

我認為您的庫項目類應該在其 CTOR 中注入Microsoft.Extensions.Logging.ILogger ,如ILogger<T> logger = null 使用它的項目有責任配置日志提供程序,就像由 DotNet Core Apps 中的 ASP.NET 通用主機完成的 OOTB 一樣。 如果有人忘記這樣做,它不會拋出錯誤(DI 解析錯誤),因為默認值為 null。

確保像logger?.LogDebug()一樣使用它並進行空檢查。

暫無
暫無

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

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