2013-04-01 4 views
9

Ich versuche NLog Leistung (neueste Version) mit Einstellungen zu testen:Warum verpasst NLog einige Meldungen beim Protokollieren einer großen Anzahl von Nachrichten?

<?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> 

und führen Sie diesen Code:

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 Datei schreibt, aber wenn die Dateigröße 1 MB erreicht er aufhört zu schreiben. Ich versuche, einfache for Schleife zu verwenden, aber es hilft mir nicht. Und ich versuche internal logging zu verwenden, aber keine Fehler ist, nebenbei gesagt sehe ich diese Strings dort:

2013-04-01 11: 36: 18,2458 Trace Opening c: \ logs/NLogTest/2013 /April/log-130401-Info.log mit concurrentWrite = false

Es ist sehr seltsam, weil concurrentWrites Standardwert true ist außerdem habe ich diesen Wert in Config gesetzt.

+0

Ist es anders, wenn Sie es in einem einzigen Thread anstelle von Parallelität versuchen? [Bearbeiten] Egal, dass du das schon geschrieben hast. – CSharpie

+0

Es gibt keinen Unterschied mit einem einzelnen Thread - wenn Datei 1MB Größe bekommt, hört es auf, es anzuhängen. – Boo

Antwort

7

Das Problem liegt in der Standardwert der AsyncWrapper s QueueLimit, das ist 10000.

Der Wert wird bestimmt, wie groß die Warteschlange von Nachrichten sein dürfen zu schreiben, stellt sich das Problem, da alle Nachrichten in der Warteschlange sind 20000 bevor irgendetwas in die Datei geschrieben wird, was bewirkt, dass NLog die letzten 10000 Nachrichten verwirft.

Leider kann dies nicht geändert werden, wenn das async Attribut verwenden, haben Sie die AsyncWrapper manuell definieren zu können, die QueueLimit steuern, die wie dies geschehen ist:

<?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> 

Wo QueueLimit bis 20000 eingestellt ist.

Sie könnten auch die OverflowAction geändert haben, wenn Sie etwas anderes tun müssen, um die Verwerfungsmeldungen nicht in die Warteschlange zu legen. Weitere Informationen finden Sie in der Dokumentation AsyncWrapper. Die Optionen sind Sperren, Verwerfen oder Vergrößern.