簡體   English   中英

NLOG:如何使用變量來指定目標

[英]NLOG: how to use variable to specify target

是否可以使用變量來指定特定目標?

我想根據運行應用程序的環境在數據庫和文件記錄之間切換。

然而,這似乎不起作用:

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

一種方法是根據環境使用不同的 Web.config 文件,然后您將更改連接字符串。 這就是我正在使用的方法。

NLOG 也會在應用程序啟動后初始化,因此您無法更改 NLOG.config 中寫入的內容

通過 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";

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM