.Net Framework 4.8 App Service中NLog.config读取Web.config配置的问题
我们的应用是运行在App Service上的.NET Framework 4.8程序,已安装以下NLog相关NuGet包:
NLog 4.7.15 NLog.Config 4.5.9 NLog.Extended 4.5.9 NLog.Web 4.6.0 NLog.Schema 4.5.9
Web.config中包含如下配置:
<connectionStrings> <add name="ElasticUrl" connectionString="http://localhost:9200"/> </connectionStrings> <appSettings> <add key="testRobot" value="12345" /> </appSettings>
请问能否在NLog.config中获取这些配置值?例如原本用<parameter name="@logged" layout="${date}" />设置日期,是否可以类似<parameter name="@logged" layout="${ConfigurationManager.AppSettings["testRobot"]}" />这样获取配置?
更新内容
已成功读取AppSettings值,但与文档建议的用法略有不同——文档使用item参数,而我必须用name:
<parameter name="@message" layout="${appsetting:name=testRobot:default=default}" />
该配置可将值12345存入message字段。
但读取连接字符串时失败:
- 尝试用
${appsetting:item=connectionStrings.ElasticUrl}读取,执行时报错:Required parameter 'Name' on 'Layout Renderer: ${appsetting}' was not specified. - 使用
${appsetting:name=connectionStrings.ElasticUrl}时,虽未抛出异常,但存储的message为空字符串。
另外还有疑问:连接字符串不在appSettings标签内,为何要使用${appsetting}来读取?
AppSettings读取的参数差异
你遇到的name与item参数的差异,源于NLog版本的兼容性:
- 你使用的NLog 4.7.15版本中,
appsetting布局渲染器已将指定键的参数名从旧版的item改为name; - 旧文档中的
item参数已过时,不再生效,因此必须用name才能正确读取AppSettings的值,这也是你配置成功的原因。
连接字符串的正确读取方式
${appsetting}布局渲染器仅负责读取appSettings节点下的配置,无法直接读取connectionStrings节点内容。你看到的文档示例可能针对的是支持扩展配置读取的NLog新版本(如NLog 5.x+),不适用于当前版本。
在NLog 4.7.15中,读取Web.config的连接字符串需要使用专门的${connectionstring}布局渲染器,配置示例如下:
<parameter name="@elasticUrl" layout="${connectionstring:name=ElasticUrl:default=http://fallback.url}" />
name参数对应Web.config中connectionStrings节点下add元素的name属性值;default为可选参数,用于指定找不到对应连接字符串时的默认值。
为何不能用${appsetting}读取连接字符串
connectionStrings是Web.config中独立于appSettings的顶级节点,.NET的ConfigurationManager也是通过ConfigurationManager.ConnectionStrings和ConfigurationManager.AppSettings分别读取这两个节点的内容。NLog的布局渲染器对应这两种不同的读取逻辑,因此必须使用专门的${connectionstring}渲染器来读取连接字符串,而非${appsetting}。
内容的提问来源于stack exchange,提问作者John

