C# 将日志记录配置从appsettings绑定到POCO Asp.Net Core 2
我有一个ApplicationConfiguration设置类,我正在将appsettings.json文件中的值绑定到该类。我可以绑定除logger LogLevel值之外的所有内容,这很可能是因为日志条目的json格式中存在子级别 我对这个班的要求如下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")); 我的记录器
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; }
}