Domanda

Che cosa dovrebbe il previsto sovraccarico essere per la registrazione? Ho provato questo esempio

 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, Registrazione

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

Certo si sarebbe probabilmente mai il login questo importo eccessivo, ma questo la prestazione ha colpito ci si aspetterebbe?

Inoltre ho provato ad utilizzare l'asyncwrapper nella configurazione

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

Soluzione

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

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

anziché

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

Credo che non ho avuto che lontano nel documentazione; -)

  

Asynchronous bersaglio involucro consente al   Codice logger per eseguire in modo più rapido,   facendo la coda dei messaggi e l'elaborazione   li in un thread separato. Dovresti   obiettivi avvolgere che spendono una non banale   Metodo quantità di tempo nella loro Write ()   con obiettivo asincrono per accelerare   registrazione. Poiché la registrazione asincrono   è piuttosto un piano d'azione comune, NLog   supporta una notazione abbreviata per   avvolgendo tutti gli obiettivi con   AsyncWrapper. Basta aggiungere Async = "true" per   l'elemento nel   file di configurazione. ... i vostri obiettivi vanno qui   ...

Tieni presente che l'utilizzo di registrazione asincrona può causare alcuni messaggi da scartare. Questo è dal disegno .


ref: https://github.com/ nlog / NLog / wiki / asyncWrapper-bersaglio # async-attributo-e-asyncwrapper

attributo Async e AsyncWrapper

Non combinare l'attributo Async e AsyncWrapper. Questo sarà solo rallentare la lavorazione e si comporterà inaffidabile.

attributo Async scarterà predefinita

L'attributo async è una scorciatoia per:

xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"

Altri suggerimenti

Per chi ha bisogno di perdere questo overhead ed è configurando dal codice, non apparire come è possibile impostare tutti i bersagli a asincrona di default - si deve definire 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);

Diffidare che per impostazione predefinita se si coda troppe voci di registro sarà solo cadere oggetti -. Un'occhiata a OverflowAction = AsyncTargetWrapperOverflowAction.Block di tornare a un comportamento sincrono

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top