Configuration 如何将appsettings.json中的设置注入iLogger提供程序?

Configuration 如何将appsettings.json中的设置注入iLogger提供程序?,configuration,asp.net-core-3.1,ilogger,Configuration,Asp.net Core 3.1,Ilogger,由于一些特殊要求,我正在实现一个定制的ILogger,其中一个要求是在项目的appsettings.json的Logging部分中有一个部分,其中包含该记录器的配置值。问题是,将这些设置注入记录器的正确方法(或好方法)是什么?我认为我应该首先在相应的ILoggerProvider中注入这些设置,并让提供程序用这些设置实例化一个记录器,但如何在提供程序中正确地注入这些值却让我感到困惑 到目前为止,我在Program.cs中有这个: 公共静态IHostBuilder CreateHostBuilde

由于一些特殊要求,我正在实现一个定制的
ILogger
,其中一个要求是在项目的
appsettings.json
Logging
部分中有一个部分,其中包含该记录器的配置值。问题是,将这些设置注入记录器的正确方法(或好方法)是什么?我认为我应该首先在相应的
ILoggerProvider
中注入这些设置,并让提供程序用这些设置实例化一个记录器,但如何在提供程序中正确地注入这些值却让我感到困惑

到目前为止,我在
Program.cs
中有这个:

公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((上下文,日志)=>
{
logging.ClearProviders();
logging.AddConfiguration(context.Configuration.GetSection(“logging”);
logging.AddConsole();
AddProvider(新的CustomLoggerProvider());
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
,appsettings.json中的相关部分是:

“日志记录”:{
“日志级别”:{
“默认值”:“信息”,
“Microsoft”:“警告”,
“Microsoft.Hosting.Lifetime”:“信息”
},
“CustomLogger”:{
“级别”:“错误”,
“Url”:“http://[Url]”
}
},
,提供程序实现如下所示:

[ProviderAlias(“CustomLogger”)]
公共类CustomLoggerProvider:ILoggerProvider
{
私人只读词典记录者;
私有只读日志级别_级别;
私人住宅已经出售;
公共日志级别
{
获取=>\u级别;
}
公共CustomLoggerProvider()
{
//在这里,我不知道应该如何注入正确的配置值
_级别=日志级别。错误;
}
公共ILogger CreateLogger(字符串类别名称)
{
if(_loggers.ContainsKey(categoryName))
{
return_loggers[categoryName];
}
var l=新的CustomLogger(本);
_添加(类别名称,l);
返回l;
}
//为了简单起见,省略了实现的其余部分
}

我找到了一个可以接受的答案,我会把它贴在这里,以防有人需要它

步骤如下:

  • 实现您的
    ILogger提供程序
    ILogger
    。微软网页上的例子是一个很好的指南
  • 让您的
    ILoggerProvider
    实现接受其构造函数上所需的设置(通过
    IOptions
    或简单参数;我正在使用名为
    MyCustomLoggerSettings
    的选项对象)
  • Startup.ConfigureServices()
    中将您的
    ILoggerProvider
    注册为单例,如下所示(假设我的实现名为
    MyCustomLoggerProvider
    ):
services.AddSingleton(p=>
{
var options=p.GetService();
返回新的MyCustomLoggerProvider(选项);
});
完成了

作为奖励,您可以通过这种方式将任何其他依赖项传递到此对象(包括在服务集合上注册的对象;在接受匿名函数的
services
中使用方法重载将服务集合作为参数,并且在那里您可以使用
GetService
来解析任何依赖项