2010-10-05 13 views
38

Quale dovrebbe essere l'overhead previsto per la registrazione? Ho provato questo esempioPrestazioni 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())); 
    } 

Con valori MAXTEST di 100,500,1000, 5000

Risultati in MAXTEST, NOLOGGING, Logging

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

Concesso si sarebbe probabilmente mai il login questo quantità eccessiva, ma è questo il colpo di prestazioni che ci si aspetterebbe?

ho anche provato ad utilizzare l'asyncwrapper nella configurazione

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

Cosa sta facendo il tuo logger? –

risposta

68

Hai solo bisogno di aggiungere l'attributo async al vostro elemento targets:

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

invece di

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

Immagino di non essere arrivato così lontano nella documentazione ;-)

Asynchronous bersaglio involucro consente al codice logger per eseguire in modo più rapido, da messaggi in coda e l'elaborazione loro in un thread separato. Dovresti inserire gli obiettivi che passano una quantità non trascurabile di di tempo nel loro metodo Write() con destinazione asincrona per accelerare la registrazione di . Poiché la registrazione asincrona è uno scenario abbastanza comune, NLog supporta una notazione abbreviata per che include tutti gli obiettivi con AsyncWrapper. Aggiungi async = "true" a l'elemento nel file di configurazione . ... i tuoi obiettivi vanno qui ...

Ricordare che l'uso della registrazione asincrona può far scartare determinati messaggi. Questo è by design.

+4

Quanta differenza ha fatto? Puoi pubblicare i tempi per confrontare il tuo primo set di risultati? –

+24

ha finito per essere ~ 44ms per 5000 con registrazione. Cordiali saluti – Eric

+1

grazie per le informazioni :) –

18

Per chi ha bisogno di perdere questo overhead ed è configurando dal codice, non guardare come è possibile impostare tutti i bersagli a asincrona default - bisogna definirlo per-bersaglio:

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

Fai attenzione che, di default, se metti in coda troppi elementi del registro, gli elementi cadranno semplicemente - guarda allo OverflowAction = AsyncTargetWrapperOverflowAction.Block per tornare al comportamento sincrono.

+0

Questo è quello che stavo cercando e grazie per l'heads up su OverflowAction. – YetAnotherDeveloper

+2

Attenzione anche a 'AsyncTargetWrapperOverflowAction.Block' se si esegue il backup durante la registrazione, è probabile che il sistema sia già sottoposto a stress. Forzare il logging per bloccare ostacolerà ulteriormente le tue prestazioni. Forse è meglio eliminare i messaggi di registro piuttosto che interrompere l'elaborazione delle richieste. –

+0

Sto scrivendo su un database di destinazione. Nella mia sezione '' 'targets''', ho marcato' '' async''' come '' 'true'''. Devo ancora scrivere codice al mio servizio web per fare in modo che il logging asincrono o il framework si occupi di esso? – Sameer

Problemi correlati