如何使用环境变量覆盖ASP.NET Core配置数组设置

Jam*_*ing 42 configuration serilog .net-core asp.net-core

LT; DR

在ASP.NET Core应用程序中,我有一个appsettings.json配置文件,它使用JSON数组来配置一组设置.

如何使用环境变量覆盖其中一个数组对象的设置?

背景

我使用serilog在ASP.NET核心应用,并使用Serilog.Settings.Configuration,允许它使用进行配置appsettings.json.

配置是这样的:

{
  "Serilog": {
    "Using":  ["Serilog.Sinks.Literate"],
    "MinimumLevel": "Debug",
    "WriteTo": [
      { "Name": "File", "Args": { "path": "%TEMP%\\Logs\\serilog-configuration-sample.txt" } }
    ],
    "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
    "Properties": {
        "Application": "Sample"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

部署时,我想覆盖一些设置,例如MinimumLevel,以及日志文件的路径.我首选的选项是在我部署到Azure应用服务时通过环境变量执行此操作,因此我将通过Azure管理门户使用应用程序设置(这些实现为环境变量).

我可以通过添加名称为的环境变量和应用程序名称来轻松设置MinimumLevel.Serilog:MinimumLevelSerilog:Properties:Application

使用数组指定设置的格式是什么?

Jam*_*ing 53

在查看调试器中的配置后,我找到了答案.

Serilog:WriteTo:0:Args:path

所以我需要使用数组索引(基于零),就好像它是一个名称.

在调试器的屏幕截图下面,如果它有帮助,也(在评论中感谢Victor Hurdugaci),单元测试是查找示例的好地方.

调试器中的配置

  • 测试是寻找示例的另一个好地方:https://github.com/aspnet/Configuration/blob/dev/test/Microsoft.Extensions.Configuration.Binder.Test/ConfigurationCollectionBindingTests.cs (6认同)
  • 如果在unix系统中使用此环境变量,则必须将`:`替换为`__`:`Serilog__WriteTo__0__Args__path` (5认同)
  • @VictorHurdugaci链接已经死了.这是一个更新的:https://github.com/aspnet/Configuration/blob/6cc477ed493e5b0da3c8f609488d667dc65a5576/test/Config.Binder.Test/ConfigurationCollectionBindingTests.cs (4认同)
  • 现在的文档建议始终使用 __ 形式而不是 : 形式,即使在 Windows 上也是如此。 (2认同)