2010-10-05 59 views
38

預期的日誌開銷應該是多少? 我已經試過了這個例子NLog性能

private class Person 
{ 
    private static Logger logger = LogManager.GetCurrentClassLogger(); 
    public string Name { get; private set; } 
    public Person(string name) 
     { 
      Name = name; 
      logger.Info("New person created with name {0}", name); 
     } 
    } 

    List<Person> people = new List<Person>(); 
    for (int i = 0; i < MAXTEST; i++) 
    { 
     people.Add(new Person(i.ToString())); 
    } 

隨着100,500,1000 MAXTEST值,5000

結果MAXTEST,NOLOGGING,記錄

100, 25ms, 186ms  
500, 33ms, 812ms  
1000, 33ms, 1554ms 
5000, 33ms, 7654ms 

授予一個可能永遠不會登錄這個量過多,但是這是人們期望的表現嗎?

我也使用asyncwrapper在配置嘗試

<target name="asyncFile" xsi:type="AsyncWrapper"> 
    <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
</target> 
+0

你的記錄器在做什麼? – 2010-10-05 23:00:10

回答

68

你只需要在async屬性添加到您的targets元素:

<targets async="true"> 
    <target name="asyncFile" xsi:type="AsyncWrapper"> 
     <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
    </target> 

,而不是

<targets> 
    <target name="asyncFile" xsi:type="AsyncWrapper"> 
     <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
    </target> 

我想我沒有那麼深入文檔;-)

異步目標包裝允許 記錄器代碼更快地通過排隊的消息和處理 它們在單獨的線程中執行, 。您應該使用異步目標在其Write()方法 中花費非常重要的 時間量來包裝目標,以加速 日誌記錄。由於異步日誌記錄 是很常見的情況,因此NLog 支持 的簡寫符號,用 包裝所有目標AsyncWrapper。只需將async =「true」添加到 配置文件中的元素 即可。 ...您的目標將轉到此處 ...

請記住,使用異步日誌記錄可能會導致某些消息被丟棄。這是by design

+4

它做了多少差異?你可以發佈時間來比較你的第一組結果嗎? – 2010-10-06 00:02:36

+24

它最終以5000ms的記錄時間爲〜44ms。問候 – Eric 2010-10-06 02:50:11

+1

感謝您的信息:) – 2010-10-06 03:24:51

18

的人誰需要失去這種開銷,並通過代碼配置,它看起來並不像您可以設置所有目標,默認情況下異步 - 你必須把它定義每個目標:

// Set up asynchronous database logging assuming dbTarget is your existing target 
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper(dbTarget); 
config.AddTarget("async", asyncWrapper); 

// Define rules 
LoggingRule rule1 = new LoggingRule("*", LogLevel.Trace, asyncWrapper); 
config.LoggingRules.Add(rule1); 

要小心,默認情況下,如果你排隊太多的日誌項目,它會放棄項目 - 看看OverflowAction = AsyncTargetWrapperOverflowAction.Block回到同步行爲。

+0

這就是我一直在尋找並感謝OverflowAction的領導。 – YetAnotherDeveloper 2014-09-04 19:39:43

+2

如果您正在進行日誌備份,請注意「AsyncTargetWrapperOverflowAction.Block」,然後很可能您的系統已經處於壓力狀態。強制日誌記錄被阻止會進一步妨礙你的表現。刪除日誌消息比停止處理請求更好。 – 2015-05-15 14:10:20

+0

我正在寫入目標數據庫。在我的'''targets'''節中,我將'async''標記爲''''''''。我是否還需要將代碼寫入我的Web服務以使日誌異步或框架處理它? – Sameer 2017-08-11 17:19:18