c# - implement - nlog file target
Rendimiento NLog (2)
Para cualquiera que necesite perder esta sobrecarga y se configure por código, no parece que pueda establecer todos los objetivos de manera asíncrona por defecto; debe definirlo por objetivo:
// 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: mire OverflowAction = AsyncTargetWrapperOverflowAction.Block
para volver al comportamiento síncrono.
¿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 MAXTEST de 100,500,1000, 5000
Resultados en MAXTEST, no Logging, Logging
100, 25ms, 186ms
500, 33ms, 812ms
1000, 33ms, 1554ms
5000, 33ms, 7654ms
De acuerdo, uno probablemente nunca registraría esta cantidad excesiva, ¿pero este es el rendimiento esperado 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>
Solo necesita agregar el atributo async
a su elemento de 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 ;-)
El contenedor de destino asincrónico permite que el código del registrador se ejecute más rápidamente, al poner en cola mensajes y procesarlos en un hilo separado. Debe ajustar los objetivos que pasan una cantidad de tiempo no trivial en su método Write () con el objetivo asincrónico para acelerar el registro. Como el registro asincrónico es un escenario bastante común, NLog admite una notación abreviada para envolver todos los objetivos con AsyncWrapper. Simplemente agregue async = "true" al elemento en el archivo de configuración. ... tus objetivos van aquí ...
Tenga en cuenta que el uso del registro asincrónico puede ocasionar que ciertos mensajes sean descartados. Esto es por diseño .