Rendimiento de NLog


¿Cuál debería ser la sobrecarga esperada para el registro? He probado este ejemplo

 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 valores máximos de 100,500,1000, 5000

Resultados en MAXTEST, noLogging, Logging

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

Concedido uno probablemente nunca registraría esta cantidad excesiva, pero esto el golpe de rendimiento que uno esperaría?

También he intentado usar el asyncwrapper en la configuración

 <target name="asyncFile" xsi:type="AsyncWrapper">
   <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
 </target>
Author: wonea, 2010-10-06

2 answers

Solo necesita agregar el atributo async a su elemento targets:

<targets async="true">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />

En lugar de

<targets>
    <target name="asyncFile" xsi:type="AsyncWrapper">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
    </target>

Supongo que no llegué tan lejos en la documentación; -)

El envoltorio de destino asíncrono permite código del registrador para ejecutar más rápidamente, haciendo cola de mensajes y procesando en un hilo separado. Deberías wrap targets that spend a non-trivial cantidad de tiempo en su método Write() con objetivo asíncrono para acelerar tala. Porque registro asíncrono es un escenario bastante común, NLog soporta una notación abreviada para envolviendo todos los objetivos con AsyncWrapper. Simplemente agregue async = "true" a el elemento en el archivo de configuración. ... tus objetivos van aquí ...

Tenga en cuenta que usar el registro asincrónico puede causar que ciertos mensajes se descarten. Esto es por diseño.


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

Atributo Async y AsyncWrapper

No combine el atributo Async y AsyncWrapper. Esto solo ralentizará el procesamiento y se comportará de manera poco fiable.

El atributo Async descartará por defecto

El atributo async es una abreviatura de:

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

 75
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 03:16:19

Para cualquiera que necesite perder esta sobrecarga y esté configurando por código, no parece que pueda establecer todos los destinos en asíncronos por defecto , debe definirlos por destino:

// 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);

Tenga cuidado de que, por defecto, si pone en cola demasiados elementos de registro, simplemente soltará elementos - mire OverflowAction = AsyncTargetWrapperOverflowAction.Block para volver al comportamiento síncrono.

 18
Author: Rob Church,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-08 16:10:26