是否可以使用变量指定特定目标?
我想根据运行应用程序的环境在数据库和文件记录之间切换。
但是,这似乎不起作用:
<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>
我想启动器会检查一次记录器,并在发生logevent时评估实际目标。
更新:使其在配置文件中不带任何变量的情况下工作。 我必须从配置中删除记录器,并通过代码创建它
var myCustomTarget = NLog.LogManager.Configuration.FindTargetByName(config.GetSection("LogTargets:TargetName").Value);
NLog.LogManager.Configuration.AddRuleForAllLevels(myCustomTarget , "MyLogger", true);
答案 0 :(得分:0)
一种实现方法是根据环境使用不同的Web.config文件,然后在其中更改连接字符串。那就是我正在使用的方法。
一旦应用程序启动,NLOG也将初始化,因此您无法更改NLOG.config中写的内容
答案 1 :(得分:0)
通过 NLog.LogManager.Configuration.Variables 设置变量不适用于 nlog.config 文件中的所有属性。我不知道为什么,但这是一个已知问题,不幸的是它是如何工作的。但是有一个简单的解决方法,这里是我如何为目标的属性 connectionString 解决此问题的示例。
<target xsi:type="Database" name="tDatabase"
dbProvider="Microsoft.Data.Sqlite.SqliteConnection, Microsoft.Data.Sqlite"
connectionString="Data Source =.\${environment:DATABASE_FILE_NAME};"
commandText="INSERT INTO ...">
<parameter name="@MachineName" layout="${machinename}" />
...
</target>
您可以像这样在代码中简单地设置环境变量
Environment.SetEnvironmentVariable("DATABASE_FILE_NAME", "foo.db");
所以您只需使用 ${environment:DATABASE_FILE_NAME} 和
Environment.SetEnvironmentVariable("DATABASE_FILE_NAME", "foo.db");
而不是 ${var:DATABASE_FILE_NAME} 和
NLog.LogManager.Configuration.Variables["DATABASE_FILE_NAME"] = "foo.db";
答案 2 :(得分:0)
NLog 4.6.7 可以更轻松地在运行时更新日志记录规则,如下所示:
<nlog>
<variable name="fileMinLevel" value="Off" />
<variable name="databaseMinLevel" value="Off" />
<rules>
<logger minLevel="${var:fileMinLevel}" writeTo="fileTarget" />
<logger minLevel="${var:databaseMinLevel}" writeTo="databaseTarget" />
</rules>
</nlog>
然后你可以这样做:
if (IsDevelopment())
LogManager.Configuration.Variables["fileMinLevel"] = "Debug";
else
LogManager.Configuration.Variables["databaseMinLevel"] = "Debug";
LogManager.ReconfigExistingLoggers();
另见:https://github.com/NLog/NLog/wiki/Filtering-log-messages#semi-dynamic-routing-rules