web-dev-qa-db-fra.com

Performances NLog

Quelle devrait être la surcharge attendue pour la journalisation? 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, Logging

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

Certes, on ne consignera probablement jamais ce montant excessif, mais est-ce que les performances sont attendues?

J'ai également 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>
49
Eric

Il vous suffit d'ajouter l'attribut async à votre élément targets:

<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 suppose que je ne suis pas allé si loin dans la documentation ;-)

L'encapsuleur cible asynchrone permet au code de l'enregistreur de s'exécuter plus rapidement, en mettant les messages en file d'attente et en les traitant dans un thread séparé. Vous devez encapsuler les cibles qui passent un temps non négligeable dans leur méthode Write () avec une cible asynchrone pour accélérer la journalisation. La journalisation asynchrone étant un scénario assez courant, NLog prend en charge une notation abrégée pour encapsuler toutes les cibles avec AsyncWrapper. Ajoutez simplement async = "true" à l'élément du fichier de configuration. ... vos cibles vont ici ...

N'oubliez pas que l'utilisation de la journalisation asynchrone peut entraîner la suppression de certains messages. C'est par conception .


réf: 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 comportera de manière non fiable.

L'attribut Async sera rejeté par défaut

L'attribut async est un raccourci pour:

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

85
Eric

Pour toute personne qui a besoin de perdre cette surcharge et qui configure par code, il ne semble pas que vous puissiez définir toutes les cibles sur asynchrones 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 en file d'attente trop d'éléments de journal, il ne fera que supprimer des éléments - regardez OverflowAction = AsyncTargetWrapperOverflowAction.Block pour revenir au comportement synchrone.

19
Rob Church