visual tutorial studio not español performance logging log4net

performance - studio - log4net tutorial español



¿Log4net es mucho más lento que System.Diagnostics.Trace? (5)

Estoy investigando las diferencias entre el uso de log4net y System.Diagnostics.Trace para el registro, y tengo curiosidad sobre las diferencias de rendimiento que he observado.

Creé una aplicación de prueba para comparar el rendimiento de ambos métodos de registro en varios escenarios, y descubro que log4net es significativamente más lento que la clase Trace . Por ejemplo, en un escenario en el que registro 1,000 mensajes sin formato de cadena, el tiempo medio de ejecución de log4net en 1,000 intentos es de 9.00ms. Trace ejecuta con una media de 1.13ms. Muchos de mis casos de prueba tienen una cantidad relativamente grande de variación en los tiempos de ejecución de log4net; la naturaleza periódica de ejecuciones largas atípicas parece sugerir la interferencia GC. Hurgar con CLR Profiler confirma que hay una gran cantidad de colecciones para una tonelada de objetos log4net.Core.LoggingEvent que se generan (para ser justos, parece que Trace genera una tonelada de objetos Char[] , pero no lo hace t muestra la gran varianza que log4net tiene).

Una cosa que tengo en cuenta aquí es que a pesar de que log4net parece aproximadamente 9 veces más lento que Trace , la diferencia es 8ms sobre 1000 iteraciones; esto no es exactamente un drenaje de rendimiento significativo. Aún así, algunos de mis casos de uso esperados podrían ser métodos de llamadas que están registrando cosas cientos de miles de veces, y estos números provienen de mi máquina rápida. En una máquina más lenta, más típica de las configuraciones de nuestros usuarios, la diferencia es de 170 ms a 11 ms, lo que es un poco más alarmante.

¿Este rendimiento es típico de log4net, o hay algunos errores que pueden aumentar significativamente el rendimiento de log4net?

( NOTA: soy consciente de que el formato de cadena puede alterar el tiempo de ejecución, estoy tratando de comparar manzanas con manzanas y tengo casos de prueba sin formato y casos de prueba con formato; log4net se mantiene proporcionalmente lento si se usa el formato de cadena o no). )

La historia hasta ahora:

  • Robert Gould tiene la mejor respuesta a la pregunta; Tenía curiosidad sobre todo si era típico ver que log4net funciona mucho más lento que la clase Trace .
  • La respuesta de Alex Shnayder es información interesante pero en realidad no cae dentro del alcance de la pregunta. La mitad de la intención de introducir este registro es ayudar a eliminar los problemas lógicos y de rendimiento en los sistemas en vivo; nuestros clientes colocan nuestros productos en muchos escenarios exóticos que a menudo son difíciles de reproducir sin costosas configuraciones de hardware a gran escala. Mi principal preocupación es que una gran diferencia de tiempo entre "no registrar" y "registrar" podría afectar el sistema de tal manera que los errores no ocurran. Al final, la escala de la disminución del rendimiento es grande pero la magnitud es pequeña, así que espero que no sea un problema.

Según mi experiencia, el rendimiento de log4net no es un problema en la mayoría de los casos. La verdadera pregunta es, ¿por qué necesitarías incluso "registrar cosas cientos de miles de veces" en un sistema de producción?
Tal como lo veo, en producción debe registrar solo el mínimo (la información puede ser un nivel de advertencia), y solo si es necesario (depurar un problema en el sitio) debería activar la depuración en el nivel de depuración.


sí log4xxx es más lento que el rastreo, ya que el rastreo es normalmente una herramienta cercana al kernel, mientras que log4xxx es una herramienta mucho más poderosa. Personalmente prefiero log4xxx por su flexibilidad, pero si quieres algo que no impacte tanto, y realmente no necesitas registros para la producción, por ejemplo, en la depuración, solo el rastreo debería ser suficiente.

Nota: uso log4xxx porque exactamente lo mismo se aplica a todos los idiomas con una biblioteca de log4 no solo .Net


Si desea lo mejor de ambos mundos, log4net le permitirá iniciar sesión también en aspnet tracer. Activo esta opción cuando quiero obtener estadísticas de rendimiento vinculadas a eventos específicos en mi registro.


es posible que le interese la biblioteca Common.Logging . Es una envoltura de abstracción delgada sobre las implementaciones de registro existentes y le permite conectar cualquier marco de registro que desee en tiempo de ejecución. También es mucho más rápido que System.Diagnostics.Trace como se describe en mi blog sobre el rendimiento .

hth, Erich


Acabo de realizar una prueba comparando la escritura secuencial con un archivo simple en comparación con el uso de Log4Net para la misma tarea. Log4Net es aproximadamente 400 veces más lento que un StreamWriter. Por lo tanto, considero que Log4Net no se puede usar si está escribiendo en enormes archivos de registro . Pero me parece muy útil para pequeñas cantidades de entradas de registro y depuración.

Tal vez una solución para aislar el registro en un hilo separado en algunos casos.