我正在使用在环境变量中覆盖的 JSON 配置文件。该文件包括 Serilog 配置,我希望能够禁用特定接收器,除非在特定条件下使用环境变量覆盖。
我发现像在这个Stack Overflow 答案中设置环境变量以用字符串覆盖数组元素WriteTo
将有效地禁用该接收器。例如,我可以将环境变量设置Serilog:WriteTo:1
为字符串disable
(或任何其他字符串)。但是,使用命名属性会更有意义,例如Serilog:WriteTo:SpecialCaseSink
.
查看ConfigurationReader
(下面)的源代码,看起来这会起作用,因为它只依赖于对部分GetChildren
进行迭代的调用WriteTo
,这就是ConfigurationLoggerConfigurationExtensions
.
除了 Serilog 更改其内部实现的风险之外,这种命名方法是否有任何缺点?是否有其他方法可以选择性地启用或禁用仅使用配置不使用索引的 Serilog 接收器?
谢谢!
void ApplySinks(LoggerConfiguration loggerConfiguration)
{
var writeToDirective = _section.GetSection("WriteTo");
if (writeToDirective.GetChildren().Any())
{
var methodCalls = GetMethodCalls(writeToDirective);
CallConfigurationMethods(methodCalls, FindSinkConfigurationMethods(_configurationAssemblies), loggerConfiguration.WriteTo);
}
}
然后
internal ILookup<string, Dictionary<string, IConfigurationArgumentValue>> GetMethodCalls(IConfigurationSection directive)
{
var children = directive.GetChildren().ToList();
var result =
(from child in children
// big query
);
return result;
}