2010-10-05 23 views
38

Kayıt için beklenen genel gider ne olmalıdır? BenNLog performansı

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

biri muhtemelen bu aşırı miktarda log asla Verilen açılıyor, MAXTEST, noLogging içinde, 5000

Sonuçları Bu örneği

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 ait MAXTEST değerleriyle

denedi, ama bu performansın bekleyeceği bir performans mı?

Ben de config asyncwrapper kullanarak denedi Yalnızca targets elemana async öznitelik eklemek gerekir

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

Kaydediciniz ne yapıyor? –

cevap

68

:

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

yerine

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

Sanırım o kadar belgeyi bulamadım ;-)

Asenkron hedef sargı kayıt cihazı kod ayrı iplik kuyruk mesajları ve işleme bunları, daha hızlı bir şekilde gerçekleştirmek için kullanılabilir. kayıt için kayıtlarını, günlüğünü hızlandırmak için Write() eşzamansız hedefle harcayacak şekilde sarmayı hedeflemelisiniz. Eşzamanlı günlüğe kaydetme oldukça yaygın bir senaryo olduğundan, NLog , için tüm hedefleri AsyncWrapper ile sarmalayan kısa bir gösterimi destekler. Sadece için async = "true" değerini yapılandırma dosyasındaki öğeye ekleyin. ... hedefleriniz burada gitmek ...

atılacak zaman uyumsuz günlüğünü kullanarak belirli iletileri neden olabileceğini unutmayın. Bu by design. Varsayılan olarak asenkronize tüm hedefleri ayarlayabilirsiniz gibi

bu yükü kaybetmek gerekiyor ve kod tarafından yapılandırılması herkes için
+4

Ne kadar bir fark yarattı? İlk sonuç kümenizle karşılaştırmak için zamanları kaydeder misiniz? –

+24

, loglama ile 5000 için ~ 44ms oldu. Saygılarımla – Eric

+1

bilgi için teşekkürler :) –

18

, gözükmüyor - Bunu tanımlamak zorunda başına hedefe:

// 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); 

Varsayılan olarak, çok fazla sayıda günlük öğeyi sıraya soktuğunuzda, yalnızca öğeleri bırakacağınız konusunda dikkatli olun - senkronize davranışa geri dönmek için OverflowAction = AsyncTargetWrapperOverflowAction.Block'a bakın.

+0

Bu benim aradığım şey ve OverflowAction üzerindeki başlıklar için teşekkürler. – YetAnotherDeveloper

+2

Ayrıca, kayıt sırasında yedekliyorsanız, AsyncTargetWrapperOverflowAction.Block'un da dikkatli olun, o zaman sisteminizin zaten stresli olabileceğini düşünebilirsiniz. Günlüğe kaydetmeyi engellemek, performansınızı daha da zorlaştırır. Belki de günlük mesajlarını işleme isteklerini durdurmaktan daha iyidir. –

+0

Hedef veritabanına yazıyorum. '' '' '' '' '' '' 'Bölümünde,' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Günlüğe kaydetme async veya framework ile ilgilenmek için web servisime hala kod yazmam gerekiyor mu? – Sameer