【发布时间】:2021-01-09 01:29:15
【问题描述】:
是否可以使用变量来指定特定的目标?
我想根据运行应用程序的环境在数据库和文件记录之间切换。
但这似乎不起作用:
<logger name="MyLogger" minlevel="Warn" writeTo="${var:myTargetName}" />
在我的应用程序启动中(第一行出现错误):
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
var config = LoadConfiguration();
NLog.LogManager.Configuration.Variables["myTargetName"] = config.GetSection("LogTargets:TargetName").Value;
NLog.LogManager.KeepVariablesOnReload = true;
NLog.LogManager.Configuration.Reload();
在应用程序启动时会抛出以下异常:
"Target ${var:myTargetName} not found."
我猜在解析配置文件时变量不可用。 如何设置变量以便 NLOG 在解析配置文件时使用它们? 是否可以使用变量来设置属性值? 还是 NLOG 不支持这个?
注意:我在 NLOG 配置中确实有另一个变量可以工作
<target xsi:type="Database" name="databaseTarget">
<connectionString>${var:connectionString}</connectionString>
...........
</target>
我猜记录器在启动时会检查一次,并在发生日志事件时评估实际目标。
更新:让它在配置文件中没有变量的情况下工作。 我不得不从配置中删除记录器并通过代码创建它
var myCustomTarget = NLog.LogManager.Configuration.FindTargetByName(config.GetSection("LogTargets:TargetName").Value);
NLog.LogManager.Configuration.AddRuleForAllLevels(myCustomTarget , "MyLogger", true);
【问题讨论】:
-
您可以使用
${configsetting}从 appsettings.json 中查找连接字符串。另见github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer