【问题标题】:Force third party code to use another ILogger implementation强制第三方代码使用另一个 ILogger 实现
【发布时间】:2023-02-24 19:33:04
【问题描述】:
大多数通过 Nuget 分发的 Microsoft 和第三方拥有的库都使用调试窗口作为默认日志记录目标(以及其他)。 App Center 和 EF Core 包只是两个实例。
我正在使用具有自定义格式和输出目标的 Microsoft.Extensions.Logging.ILogger 实现,并希望在我的自定义日志中捕获这些库的日志。
我的假设是,通过 ServiceProvider 填充其实现将替换默认的 Logger,并让依赖于 ILogger 的第三方代码使用它。但他们仍然只是以常规格式登录到控制台。
我可以想到出现这种情况的几个可能原因:
- 这些非托管类库对服务提供者一无所知。
- 这些包实际上并不依赖
Microsoft.Extensions.Logging.ILogger 接口进行日志记录。
- 他们这样做,但他们更喜欢他们的实施而不是任何已注册的。它需要一个公共方法来强制类库使用另一个 Logger(大多数包不提供这样的接口)。
- 我缺少一些我需要为其提供实现的其他服务(例如 ILoggerFactory)。
任何帮助将非常感激。
【问题讨论】:
标签:
.net
.net-core
logging
dependency-injection
【解决方案1】:
对于 EF Core,您可以为 DbContext 与您的日志记录基础设施 by defining a logger factory injection 集成:
(来自文档)
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
然后应该向 EF Core 注册此单例/全局实例
在 DbContextOptionsBuilder 上。例如:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory)
.UseSqlServer(@"Server=(localdb)mssqllocaldb;Database=EFLogging;Trusted_Connection=True");