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