如何在appsettings的Serilog配置段中引用其他appsettings配置值?
问题
使用Serilog.Settings.Configuration(可能还需Serilog.Expressions)组件时,能否在appsettings的Serilog配置段中引用其他配置值?我希望动态设置BrowserHttp接收器的endpointUrl,无需重复BaseUrl值或在appsettings外部指定该值。
Serilog.Settings.Configuration的README文档中有关于IConfiguration参数的章节,但未提供对应场景的示例。我尝试了多种写法均无法正确设置该值,仅硬编码重复值的方式可行,具体尝试的配置如下:
"App": { "BaseUrl": "https://localhost:1234" }, "Serilog": { "Using": [ "Serilog.Sinks.BrowserConsole", "Serilog.Sinks.BrowserHttp", "Serilog.Expressions" ], "WriteTo": [ { "Name": "BrowserHttp", "Args": { // 这个写法有效 //"endpointUrl": "https://localhost:1234/ingest" // 以下写法均无效: //"endpointUrl": "{Concat(App.BaseUrl, '/ingest')}" //"endpointUrl": "{App.BaseUrl}/ingest" //"endpointUrl": "{App:BaseUrl}/ingest" //"endpointUrl": "{BaseUrl}/ingest" //"endpointUrl": "{AppSettings:App:BaseUrl}/ingest" //"endpointUrl": "App.BaseUrl/ingest" } } ] }
解决方案
要在Serilog配置中引用其他appsettings值,需借助Serilog.Expressions的表达式语法,具体配置方式如下:
- 确保已安装
Serilog.Expressions包(你已在Using节点中声明该组件,此条件已满足) - 用
%包裹表达式内容,通过Configuration()函数读取目标配置节点 - 直接拼接字符串完成endpointUrl的组合
修改后的有效配置写法:
"endpointUrl": "%Configuration('App:BaseUrl')/ingest%"
如果需要处理更复杂的拼接逻辑(比如兼容BaseUrl末尾带/或不带/的情况),可以使用Concat函数:
"endpointUrl": "%Concat(TrimEnd(Configuration('App:BaseUrl'), '/'), '/ingest')%"
原理:Serilog.Settings.Configuration会识别%包裹的Serilog表达式,通过Configuration()函数可直接读取当前IConfiguration中的任意节点值,彻底避免硬编码重复配置项。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

