NLog文章系列——如何優(yōu)化日志性能
作者:Jaros?aw Kowalski <jaak@jkowalski.net>
翻譯:CrazyCoder(由衷感謝他的熱心!!)
原文:http://www.nlog-project.org/howto_optimize_performance.html
更多關于NLog的中文文章,請參考《NLog文章系列》。
概述
日志的記錄有時也要化為頗為可觀的時間。本文的目的就是揭開日志記錄的內(nèi)部機理并提供一些有用的技巧幫助使用者優(yōu)化日志記錄的性能。
日志記錄過程分析
每條日志信息的記錄都需要經(jīng)過一系列的步驟才能完成,其中包括諸如檢查消息是否需要被記錄以及輸出到哪里等。每一條日志的記錄都包括以下這些操作:
- 準備日志參數(shù)。這是由(.NET/Mono)的公共語言運行時完成的,通常由于一些內(nèi)部的裝箱和數(shù)組的操作會導致一些性能上的損失。
- 日志參數(shù)準備好以后就可以調(diào)用相應的日志方法(
Debug(), Info(), Warn(), Error(), Fatal()orLog())。 - 日志方法以極快的速度檢查該日志在該級別的輸出是否已經(jīng)被允許。由于使用了合適的數(shù)據(jù)結(jié)構(gòu),這一操作的速度很快。
- 即使成功通過上一步的檢查,日志消息還是有可能不會被記錄 – 過濾器的檢查不通過的話消息就會被拒絕記錄。注意,這一步可能很耗時。
- 經(jīng)過上述幾個操作,日志消息被允許記錄了 – 這是要根據(jù)消息和傳遞給日志記錄方法的參數(shù)對消息進行格式化。由于
String.Format并不快,這一操作可能會很慢。 - 最后一步就是把日志發(fā)送給一個或多個需要寫入的輸出目標。這通常是最慢的一個操作,主要是因為寫入的目標通常是一些持久性的存儲(文件,數(shù)據(jù)庫)設備,向這些設備寫入數(shù)據(jù)很花時間。
“太糟糕了…”,這可能是你現(xiàn)在的想法吧。不過幸運的是NLog提供了許多編程方面的機制來給日志記錄提速。
性能優(yōu)化技巧
緩存日志記錄者
一旦通過調(diào)用LogManager.GetLogger()方法得到了需要的日志記錄者,最好的做法是能夠把它保存在什么地方,這樣就可以重復使用同一個實例而不需要再次調(diào)用LogManager.GetLogger()。給類聲明一個靜態(tài)的成員是個不錯的辦法,下面就是一個例子:
using NLog; class MyClass { // storing logger reference in a static variable is clean and fast static Logger logger = LogManager.GetLogger("MyClass");
static void Main()
{ logger.Debug("This is a debugging message"); // it is not recommended to get the logger and store it in a local variable Logger logger2 = LogManager.GetLogger("MyClass"); logger2.Debug("This is a debugging message"); }
}
TODO: add more tips here
浙公網(wǎng)安備 33010602011771號