2013-04-01 79 views
9

我嘗試測試與設置NLOG性能(最新版本):爲什麼記錄大量消息時NLog會丟失一些消息?

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true"> 
    <variable name="basePath" value="c:\logs\" /> 
    <variable name="msgFormat" value="${message}" /> 
    <targets async="true"> 
     <target name="file" 
       xsi:type="File" 
       fileName="${basePath}/${logger}/${date:format=yyyy}/${date:format=MMMM}/log-${date:format=yyMMdd}-${level}.log" 
       layout="${msgFormat}" 
       concurrentWrites="true" /> 
    </targets> 
    <rules> 
     <logger name="*" minlevel="Debug" writeTo="file"/> 
    </rules> 
</nlog> 

,並運行此代碼:

var msg = "this is example string for logging test. it's not very long, but not very short"; 
var count = 20000; 
Parallel.For(0, count, x => nlog.Info(msg)); 

NLOG寫入文件,但是當文件大小達到1MB它停止寫作。我嘗試使用簡單的for循環,但它對我沒有幫助。 我嘗試使用internal logging,但沒有錯誤,由我看到有這個字符串的方式:

2013年4月1日11:36:18.2458跟蹤開幕 C:\日誌/ NLogTest/2013與 concurrentWrite =假

這是非常奇怪的/April/log-130401-Info.log,因爲concurrentWrites默認值是true,而且我已經設置在配置此值。

+0

如果你在單線程中而不是並行性中嘗試它有什麼不同?沒關係,你已經寫好了。 – CSharpie

+0

單線程沒有區別 - 當文件獲得1MB大小時,它不再附加到它。 – Boo

回答

7

問題在於AsyncWrapper小號QueueLimit的默認值,即10000

值決定的消息寫的隊列中有多大的允許是,問題就出現了,因爲所有20000個消息排隊在寫入文件之前,導致NLog丟棄最後的10000條消息。

不幸的是使用async屬性時,這個無法改變,你必須手動定義AsyncWrapper能夠控制QueueLimit,這是這樣完成的:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true"> 
    <variable name="basePath" value="c:\logs\" /> 
    <variable name="msgFormat" value="${message}" /> 
    <targets async> 
     <target name="asyncWrapper" xsi:Type="AsyncWrapper" queueLimit="20000"> 
      <target name="file" 
       xsi:type="File" 
       fileName="${basePath}/${logger}/${date:format=yyyy}/${date:format=MMMM}/log-${date:format=yyMMdd}-${level}.log" 
       layout="${msgFormat}" 
       concurrentWrites="true" /> 
     </target> 
    </targets> 
    <rules> 
     <logger name="*" minlevel="Debug" writeTo="file"/> 
    </rules> 
</nlog> 

凡QueueLimit設置爲20000。

如果您需要執行其他丟棄消息未放入隊列中,您還可以更改OverflowAction,請參閱AsyncWrapper文檔以獲取更多信息。選項是阻止,放棄或增長。