为不同的服务集合配置日志记录提供程序
Configure a logging provider for a different service collection
这是 .NET 6 中的 ASP.NET 应用程序。有一个向导界面,用户可以在其中输入一些数据,然后根据输入设置一个新的依赖项注入容器,其中包含所需的服务完成任务。我的问题是来自第二个容器的 ILogger<>
实例不使用我设置的自定义 ILoggingProvider
。
Program.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
实例时,它表明它没有正在写入的记录器到.
所以我的自定义日志记录提供程序一定是第二个容器不知道的情况,但我不知道如何在那里注册它。
提前致谢。
由于您是从头开始创建新的 ServiceCollection
,因此您还需要从头开始添加日志基础结构:
IServiceCollection services = new ServiceCollection();
services.AddLogging(builder => builder.AddDebug().AddSignalRLogging());
这是 .NET 6 中的 ASP.NET 应用程序。有一个向导界面,用户可以在其中输入一些数据,然后根据输入设置一个新的依赖项注入容器,其中包含所需的服务完成任务。我的问题是来自第二个容器的 ILogger<>
实例不使用我设置的自定义 ILoggingProvider
。
Program.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
实例时,它表明它没有正在写入的记录器到.
所以我的自定义日志记录提供程序一定是第二个容器不知道的情况,但我不知道如何在那里注册它。
提前致谢。
由于您是从头开始创建新的 ServiceCollection
,因此您还需要从头开始添加日志基础结构:
IServiceCollection services = new ServiceCollection();
services.AddLogging(builder => builder.AddDebug().AddSignalRLogging());