![](/img/trans.png)
[英]How do I specify a layout for an ApplicationInsights Nlog target?
[英]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.