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>
42
demandé sur wonea 2010-10-06 02:28:13

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"

75
répondu Eric 2018-09-10 03:16:19

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.

18
répondu Rob Church 2013-02-08 16:10:26