C# 将日志记录配置从appsettings绑定到POCO Asp.Net Core 2

C# 将日志记录配置从appsettings绑定到POCO Asp.Net Core 2,c#,dependency-injection,configuration,asp.net-core-2.0,C#,Dependency Injection,Configuration,Asp.net Core 2.0,我有一个ApplicationConfiguration设置类,我正在将appsettings.json文件中的值绑定到该类。我可以绑定除logger LogLevel值之外的所有内容,这很可能是因为日志条目的json格式中存在子级别 我对这个班的要求如下 services.Configure<ApplicationConfigurationSettings>(Configuration.GetSection("ApplicationConfiguration")); 我的记录器

我有一个ApplicationConfiguration设置类,我正在将appsettings.json文件中的值绑定到该类。我可以绑定除logger LogLevel值之外的所有内容,这很可能是因为日志条目的json格式中存在子级别

我对这个班的要求如下

 services.Configure<ApplicationConfigurationSettings>(Configuration.GetSection("ApplicationConfiguration"));
我的记录器POCO

public class LoggerSettings
{
    public bool IncludeScopes { get; set; }
    public KeyValuePair<string,string> LogLevel { get; set; }
}
{[ApplicationConfiguration:Logging:IncludeScopes,False]}{[ApplicationConfiguration:Logging:LogLevel:Default,Warning]}

我似乎无法在类中正确设置该属性,使其正确绑定。

Json对象

"LogLevel": {
  "Default": "Warning"
}
由于一个简单的原因,无法映射到
公钥值对日志级别{get;set;}
属性。如果一段时间后,该部分将扩展为其他字段,该怎么办

"LogLevel": {
  "Default": "Warning",
  "SomeOtherField": "SomeValue"
}
应如何将其映射到单个
KeyValuePair
?当然,在您的简单示例中,这样的单键值对象可能会被映射,但configuration binder在其假设中并没有做到这一点,它只是不以这种方式工作

我认为这是一件好事,因为您试图从强类型POCO转换到一些键值包,这在某种程度上降低了.NETCore中采用的整个强类型配置方法的价值

解决你的问题很简单。只需使用
string
类型的单个属性
Default
声明
LoggingLevel
类:

public class LoggingLevel
{
    public string Default { get; set; }
}

public class LoggerSettings
{
    public bool IncludeScopes { get; set; }

    public LoggingLevel LogLevel { get; set; }
}
您可以更进一步,将
Default
属性的类型设置为
Microsoft.Extensions.Logging.LogLevel
。配置绑定器将正确地将字符串值(如
“Warning”
映射到枚举值
日志级别。Warning

public class LoggingLevel
{
    public LogLevel Default { get; set; }
}

拥有如此简单的POCO似乎有些过分,而且对于高级配置,您将拥有相当多的POCO。但事实上,这是一种方式,强类型、显式和可扩展。

ty,但你可能已经意识到,在回答我的Serilog问题后,我转而使用Serilog。我将使用键入的poco的有,所以这个答案肯定有助于我在这方面regard@CodeFuller...wanna连续三个?我有另一个问题贴在这里。。。
public class LoggingLevel
{
    public string Default { get; set; }
}

public class LoggerSettings
{
    public bool IncludeScopes { get; set; }

    public LoggingLevel LogLevel { get; set; }
}
public class LoggingLevel
{
    public LogLevel Default { get; set; }
}