56 votes

Performances du NLog

Quels sont les frais généraux prévus pour l'enregistrement ? 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

Il est vrai que l'on n'enregistrerait probablement jamais une telle quantité de données, mais s'agit-il de l'impact sur les performances auquel on s'attendrait ?

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>

98voto

Eric Points 841

Il suffit d'ajouter le async à l'attribut targets élé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 suppose que je ne suis pas allé aussi loin dans la documentation ;-)

Enveloppe asynchrone de la cible logger de s'exécuter plus rapidement, en mettant les messages en file d'attente et en les dans un thread séparé. Vous devriez envelopper les cibles qui passent un temps non temps non négligeable dans leur méthode Write() avec une cible asynchrone afin d'accélérer le processus de l'enregistrement. Parce que la journalisation asynchrone est un scénario assez courant, NLog supporte une notation abrégée pour envelopper toutes les cibles avec AsyncWrapper. Il suffit d'ajouter async="true" à l'élément à l'élément dans le fichier dans le fichier de configuration. ... vos cibles vont ici ...

Gardez à l'esprit que l'utilisation de la journalisation asynchrone peut entraîner le rejet de certains messages. Il s'agit de par conception .


ref : https://github.com/nlog/NLog/wiki/AsyncWrapper-target#async-attribute-and-asyncwrapper

Attribut Async et AsyncWrapper

Ne combinez pas l'attribut Async et l'AsyncWrapper. Cela ne fera que ralentir le traitement et ne sera pas fiable.

L'attribut asynchrone sera ignoré par défaut.

L'attribut async est une abréviation de :

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

23voto

Rob Church Points 1300

Pour ceux qui ont besoin de se débarrasser de cette surcharge et qui configurent par code, il ne semble pas que vous puissiez définir toutes les cibles comme 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);

Attention, par défaut, si vous mettez en file d'attente un trop grand nombre d'éléments d'enregistrement, il les laissera tomber. OverflowAction = AsyncTargetWrapperOverflowAction.Block pour revenir à un comportement synchrone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X