【问题标题】:Configure a logging provider for a different service collection为不同的服务集合配置日志记录提供程序
【发布时间】:2022-01-07 16:52:33
【问题描述】:

这是 .NET 6 中的 ASP.NET 应用程序。有一个向导界面,用户在其中输入一些数据,然后根据输入,我设置了一个新的依赖注入容器,其中包含完成任务所需的服务.我的问题是来自第二个容器的ILogger<> 实例不使用我设置的自定义ILoggingProvider

程序.cs:

var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddDebug();
builder.Logging.AddSignalRLogging();
public static class ILoggingBuilderExtensions
{
    public static ILoggingBuilder AddSignalRLogging(this ILoggingBuilder builder) 
        => builder.AddProvider(new SignalRLoggerProvider(builder.Services))
           .AddFilter<SignalRLoggerProvider>("MyNamespace", LogLevel.Information);
}

SignalRLoggerProvider 来自How to implement an ILogger to send messages to a SignalR Hub?

控制器:

IServiceCollection services = new ServiceCollection();
services.AddLogging();
services.AddSignalR();
services.AddSingleton(_sheetsClient); // this was injected into the controller
services.AddSingleton<ITeamReaderService>(new PostedTeamReaderService(model.Divisions));

string[] divisionNames = model.Divisions.Keys.ToArray();
foreach (string divisionName in divisionNames)
{
    services.AddSingleton<IDivisionSheetService>(provider => new DivisionSheetService(divisionName,
        provider.GetRequiredService<StandingsRequestCreatorFactory>(),
        provider.GetRequiredService<ISheetsClient>(),
        provider.GetRequiredService<IOptionsMonitor<ScoreSheetConfiguration>>(),
        provider.GetRequiredService<ILogger<DivisionSheetService>>()) 
    );
}

我知道我的提供程序可以正常工作,因为当我将依赖项从 HostBuilder 的服务集合 (_sheetsClient) 注入的控制器中记录内容时,这些消息可以正常工作。在来自另一个容器 (DivisionSheetService) 的类中,这些日志消息无处可去,当我在调试器中查看 ILogger 实例时,它表明它没有正在写入的记录器。

所以肯定是我的自定义日志记录提供程序对第二个容器是未知的,但我不知道如何在那里注册它。

提前致谢。

【问题讨论】:

  • 这与您的问题无关,但您可以使用ActivatorUtilities.CreateInstance&lt;DivisionSheetService&gt;(provider, divisionName) 代替DivisionSheetService ctor(请参阅reference
  • @Métoule Nice,不知道那个。

标签: c# asp.net-core logging


【解决方案1】:

由于您要从头开始创建新的ServiceCollection,因此您还需要从头开始添加日志记录基础架构:

IServiceCollection services = new ServiceCollection();
services.AddLogging(builder => builder.AddDebug().AddSignalRLogging());

【讨论】:

  • 天哪,我怎么没看到超载?谢谢!
猜你喜欢
  • 2020-04-22
  • 2012-03-08
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多