![](/img/trans.png)
[英]How do I setup a FileAppender logger from log4net for a .NET Standard 2.0 class library?
[英]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.