NLOG:如何使用变量指定目标

时间:2019-03-05 11:26:21

标签: c# nlog

是否可以使用变量指定特定目标?

我想根据运行应用程序的环境在数据库和文件记录之间切换。

但是,这似乎不起作用:

<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);

3 个答案:

答案 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