NLog performance
quels devraient être les frais généraux prévus pour l'exploitation forestière? J'ai essayé cet exemple
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()));
}
avec des valeurs MAXTEST de 100.500.1000, 5000
Résultats dans MAXTEST,noLogging, la Journalisation
100, 25ms, 186ms
500, 33ms, 812ms
1000, 33ms, 1554ms
5000, 33ms, 7654ms
accordé on n'enregistrerait probablement jamais cette quantité excessive, mais est - ce le résultat de la performance à laquelle on s'attendrait?
j'ai aussi essayé d'utiliser l'asyncwrapper dans la configuration
<target name="asyncFile" xsi:type="AsyncWrapper">
<target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
</target>
2 réponses
il suffit d'ajouter le async
l'attribut targets
elément:
<targets async="true">
<target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
au lieu de
<targets>
<target name="asyncFile" xsi:type="AsyncWrapper">
<target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
</target>
je pense que je n'ai pas bien loin dans la documentation ;-)
asynchrone target wrapper permet code logger à exécuter plus rapidement, en faisant la queue pour les messages et le traitement dans un thread séparé. Vous devriez envelopper les cibles qui dépensent un non-trivial quantité de temps dans leur méthode D'écriture() avec une cible asynchrone accélérer journalisation. Parce que l'enregistrement asynchrone est un scénario commun, NLog prise en charge d'une notation abrégée pour envelopper toutes les cibles avec AsyncWrapper. Juste ajouter async=true" à l'élément dans la fichier de configuration. ... les objectifs de votre rendez-vous ici ...
gardez à l'esprit que l'utilisation de la journalisation asynchrone peut entraîner le rejet de certains messages. C'est design.
ref: https://github.com/nlog/NLog/wiki/AsyncWrapper-target#async-attribute-and-asyncwrapper
attribut Async et AsyncWrapper
ne combinez pas l'attribut Async et AsyncWrapper. Cela ne fera que ralentir le traitement et se comportent mal.
l'attribut Async se défait par défaut
l'attribut async est une abréviation pour:
xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"
Pour ceux qui ont besoin de perdre cette surcharge et est la configuration par code, il ne semble pas que vous pouvez définir toutes les cibles asynchrone par défaut, vous devez le définir par-cible:
// 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);
méfiez - vous que par défaut si vous mettez trop d'éléments en file d'attente, il suffit de laisser tomber les éléments-regardez OverflowAction = AsyncTargetWrapperOverflowAction.Block
pour revenir au comportement synchrone.