2012-09-03 45 views
4

NLog有能力通過${callsite:className=Boolean:fileName=Boolean:includeSourcePath=Boolean:methodName=Boolean}: 渲染器包含調用點信息。NLog中調用點佈局渲染器對性能的影響

我假設NLog獲取堆棧跟蹤來實現此功能。

我想知道是否是這種情況,或者如果NLog的優化超越了在每次調用日誌時創建新的堆棧跟蹤,以及在寫入大量日誌條目的應用程序中性能影響如何?

+0

僅供參考:[Callsite-layout-renderer]的NLog文檔(https://github.com/NLog/NLog/wiki/Callsite-layout-renderer) –

回答

4

的.NET框架並沒有提供更多的選擇[1]來獲得一個堆棧跟蹤,而不是直接或通過ExceptionEnvironment.StackTrace作爲一個字符串使用StackTrace類,所以有更多的小NLOG可以做。此外,對於每個日誌調用,調用堆棧(可能)會不同。一個例外是循環內的日誌調用。但即使在這種情況下,也需要一些機制來幫助NLog甚至知道該呼叫是從前一個呼叫的「同一地點」進行的。這隻能在調用堆棧中再次確定。因此,總而言之,我會假設NLog必須做到這一點:在所有正在進行的日誌調用中捕獲調用堆棧(儘管不是用於處理調用的每個佈局/ appender) - 就像log4net那樣「警告」這個選項是高頻率日誌調用的性能問題。

無論如何,你可能想看看source,這也表明(雖然我沒有在調試器中介紹過它),但每個日誌調用都會捕獲一個callstack。

UPDATE爲了完整起見,從.NET 4.5開始,可以使用caller info attributes。不過,他們有自己的「限制」,就像不包括typename一樣。但是,他們目前沒有被NLog使用。

[1]除了可能使用一些IL級別重寫或在調試器中運行應用程序。

+0

感謝您的信息。您是否還知道每個日誌調用獲取一個堆棧跟蹤的性能影響? – GaussZ

+0

每個日誌調用會比沒有?!?慢? ;-)認真地說,當然會更慢,你知道的。確切的數字不能被告知,因爲這取決於你的應用程序(多少次日誌/秒,甚至可能是堆棧的深度等)。 –