2010-10-05 22 views
38

¿Cuál debe ser la sobrecarga esperada para el registro? He tratado este ejemploNLog rendimiento

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 MAXTEST de 100,500,1000, 5000

Resultados en MAXTEST, NOLOGGING, Registro de

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

Concedido uno probablemente nunca habría registrar esta cantidad excesiva, pero este es 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> 
+0

¿Qué hace su registrador? –

Respuesta

68

Sólo tiene que añadir el atributo async a su elemento targets:

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

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

asíncrono envoltura objetivo permite que el código logger para ejecutar más rápidamente, por mensajes y procesamiento ellos haciendo cola en un hilo separado. Debería ajustar los objetivos que emplean una cantidad de tiempo no trivial de en su método Write() con el objetivo asincrónico para acelerar el registro de . Como el registro asincrónico es un escenario bastante común, NLog admite una notación abreviada para que engloba todos los destinos con AsyncWrapper. Simplemente agregue async = "true" al el elemento en el archivo de configuración . ... sus objetivos van aquí ...

Tenga en cuenta que el uso del registro asincrónico puede hacer que se descarten algunos mensajes. Esto es by design.

+4

¿Cuánta diferencia hizo? ¿Puedes publicar los tiempos para compararlos con tu primer conjunto de resultados? –

+24

terminó siendo ~ 44ms para 5000 con el registro. Saludos – Eric

+1

gracias por la información :) –

18

Para cualquier persona que necesita perder esta sobrecarga y se configura por el código, que no parece que se pueden establecer todos los objetivos a asíncronos por defecto - que tiene que definirlo por la diana:

// 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, de forma predeterminada, si pone en cola demasiados elementos de registro, simplemente suelte los elementos: consulte OverflowAction = AsyncTargetWrapperOverflowAction.Block para volver al comportamiento sincrónico.

+0

Esto es lo que estaba buscando y gracias por el aviso en OverflowAction. – YetAnotherDeveloper

+2

También tenga cuidado con 'AsyncTargetWrapperOverflowAction.Block' si está haciendo una copia de seguridad en el registro, entonces es probable que su sistema ya esté estresado. Forzar el registro a bloquear obstaculizará aún más su rendimiento. Tal vez sea mejor dejar caer mensajes de registro que dejar de procesar las solicitudes. –

+0

Escribo en una base de datos de destino. En mi sección '' 'targets''', he marcado' '' async''' como '' 'true'''. ¿Todavía tengo que escribir el código en mi servicio web para que el registro asincrónico o el marco se encargue de ello? – Sameer