如何使用环境变量覆盖 ASP.NET Core 配置数组设置
Posted
技术标签:
【中文标题】如何使用环境变量覆盖 ASP.NET Core 配置数组设置【英文标题】:How to override ASP.NET Core configuration array settings using environment variables 【发布时间】:2016-10-06 01:19:00 【问题描述】:TL;DR
在一个 ASP.NET Core 应用程序中,我有一个 appsettings.json
配置文件,它使用 JSON 数组来配置一组设置。
如何使用环境变量覆盖其中一个数组对象的设置?
背景
我在 ASP.NET Core 应用程序中使用 Serilog 并使用 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"
部署时,我想覆盖一些设置,例如MinimumLevel,以及日志文件的路径。我的首选选项是在部署到 Azure 应用服务时通过环境变量执行此操作,因此我将通过 Azure 管理门户使用应用设置(这些被实现为环境变量)。
我可以通过添加名称为Serilog:MinimumLevel
和应用程序名称Serilog:Properties:Application
的环境变量轻松设置MinimumLevel。
用数组指定设置的格式是什么?
【问题讨论】:
我遇到了同样的问题 - 我无法忍受名称、冒号和数组索引的魔力 (Serilog:WriteTo:0:Args:path),几个月前我写了一个新的配置提供程序使这种配置更容易 - github.com/dsbenghe/NotMicrosoft.Configuration @Dumitru "创建 appsettings.envname.json 并重复整个过程!!! Serilog json 块再次使用 MinimumLevel 和 pathFormat 的新值 - 这可能是你能做的最糟糕的事情" - 这是不对。您只需要指定更改的设置。 【参考方案1】:在调试器中查看配置后我找到了答案。
Serilog__WriteTo__0__Args__path
(所有平台)
Serilog:WriteTo:0:Args:path
(Windows)
Serilog--WriteTo--0--Args--path
(来自 Azure Key Vault)
注意:Configuration in ASP.NET Core 文档现在涵盖了这一点。
所以我需要像使用名称一样使用数组索引(从零开始)。
这是调试器的屏幕截图,也(感谢 cmets 中的Victor Hurdugaci),unit tests 是查找示例的好地方。
【讨论】:
测试是寻找示例的另一个好地方:github.com/aspnet/Configuration/blob/dev/test/… @VictorHurdugaci 链接已死。这是一个更新的:github.com/aspnet/Configuration/blob/… @JamesSkimming 嗯,我只检查了评论中的链接:) 如果你在unix系统中使用这个环境变量,你必须把:
替换成__
:Serilog__WriteTo__0__Args__path
现在的文档建议始终使用 __ 形式而不是 : 形式,即使在 Windows 上也是如此。以上是关于如何使用环境变量覆盖 ASP.NET Core 配置数组设置的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 docker-compose 环境变量不起作用 ASP.Net Core MVC
如何从 ASP.NET Core 的 Main() 中获取环境变量?
Asp.Net Core 入门—— 环境变量 TagHelper