2012-03-09 148 views
2

我的應用程序爲應用程序本身創建一個日誌,記錄它何時被激活,以及應用程序級別發生了什麼。NLog配置API:使用存儲在變量中的佈局

應用程序以'profiles'爲中心 - 用戶加載一個配置文件,告訴應用程序何時/何時/如何/如何。所以我也想爲每個配置文件創建一個日誌,記錄每次運行配置文件時的進度。

目前爲止沒有問題...除了我希望配置文件日誌與配置文件本身一起存儲,所以這意味着我需要動態配置NLog,所以我可以在運行時告訴它fileTarget路徑。

但是,我也想存儲我想使用的標準佈局,作爲NLog.config中的變量;這似乎是從我讀過的內容中看到的一種常見的方法。

然而,在下面的行

fileTarget.Layout = "${myLayout}" 

...我得到一個ArgumentException:

LayoutRenderer cannot be found: 'myLayout' 

此刻,我的佈局變量只是:

<variable name="myLayout" value="${message}" /> 

是你不能使用變量來通過API指定佈局嗎?如果是這樣,我會很驚訝。或者我在某個地方出了問題?

該解決方案非常簡單 - 我可以使用手動指定的佈局填充fileTarget.Layout,但儘管如此,我很想知道Plan A是否可以工作。

回答

2

如果您使用NLog站點的編譯二進制文件,這是不可能的,主要是因爲NLog沒有公開訪問<variable>元素的API。

您可以建議作者添加此功能,或者如果您真的熱衷於擁有此功能,請下載並修改源代碼。 private string ExpandVariables(string input)在文件XmlLoggingConfiguration.cs是你需要公開的。

祝你好運。

+0

呃...修改源代碼或者只是將佈局存儲在應用程序的設置文件中?鑑於時間尺度,這是一件不容易的事情! :)但謝謝你的迴應。 – CJM 2012-03-09 22:57:12

+0

我會做出同樣的選擇,如果我是你(看到我的回覆類似[這裏](http://stackoverflow.com/questions/9523875/how-to-set-nlogs-filename-to-the- process - 啓動 - 日期/ 9524600#9524600))。 – AVIDeveloper 2012-03-09 23:26:08

+0

這個答案不再準確。請參閱下面的答案。 – MarkR 2015-03-18 18:17:26

5

我得到了最新的源代碼(NLog 3.2.0.0)並找出了一個支持而不需要對NLog進行任何修改的解決方案。下面的代碼獲取變量的值。我認爲它也可以寫入,但我沒有嘗試,因爲我不需要該功能。這回答了這個問題。最後一行評估變量中的文本以呈現其包含的任何佈局渲染器。

var config = (NLog.Config.XmlLoggingConfiguration)LogManager.Configuration; 
string dir = config.Variables["logDirectory"]; 
dir = NLog.Layouts.SimpleLayout.Evaluate(dir);