【问题标题】: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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多