¿Qué tan rápido es un método de registro log4net (depuración, información, etc.)?

StackOverflow https://stackoverflow.com/questions/178973

  •  05-07-2019
  •  | 
  •  

Pregunta

Soy un gran fan de log4net , pero recientemente, algunos (en mi departamento) han cuestionado su inclusión en nuestros proyectos debido a la pesadez aparentemente de cada método de registro. Yo diría que hay mejores técnicas que otras, pero esa es otra pregunta.

Tengo curiosidad por saber cuál es el impacto típico de una llamada log4net DebugFormat-type en sus aplicaciones. Voy a dejar de lado variables como el número de declaraciones de registro por líneas de código, etc., porque solo estoy buscando cualquier cosa que hayas visto en el mundo real.

Y, soy consciente de la técnica simple de agregar una cláusula de protección a las declaraciones de evaluación largas, por ejemplo:

if (log.IsDebug)
{
  log.DebugFormat(...);
}

Por lo tanto, excluyamos eso de la consideración por ahora.

¿Fue útil?

Solución

No estoy familiarizado con log4net, o log.DebugFormat (...).

Pero el costo del registro es realmente en dos áreas.

La primera es la llamada de registro, y la segunda es la persistencia real de la información de registro.

Los guardias ayudan a reducir la llamada de registro al mínimo cuando el registro no es realmente necesario. Tiende a ser muy rápido, ya que es poco más que una llamada de método y una comparación de dos escalares.

Sin embargo, cuando no usa guardias, el costo puede convertirse en el precio de crear los argumentos de registro reales.

Por ejemplo, en log4j, este era un lenguaje común:

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted.");

Aquí, el costo es la evaluación real de la expresión de cadena que hace el mensaje. Esto se debe a que, independientemente del nivel de registro, se crean esa expresión y la cadena resultante. Imagínate si en cambio tuvieras algo como:

log.debug("Something wrong with this list: " + longListOfData);

Eso podría crear una variable de cadena grande y costosa que, si el nivel de registro no se configuró para DEBUG, simplemente se perdería.

Los guardias:

if (log.isDebug()) {
    log.debug(...);
}

Elimine ese problema, ya que la llamada isDebug es barata, especialmente en comparación con la creación real del argumento.

En mi código, he escrito un contenedor para el registro y puedo crear registros como este:

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo());

Este es un buen compromiso. Esto se basa en Java Varargs, y mi código comprueba el nivel de registro y, a continuación, formatea el mensaje adecuadamente. Esto es casi tan rápido como los guardias, pero mucho más limpio para escribir.

Ahora, log.DebugFormat puede hacer algo similar, que no sé.

Además de esto, por supuesto, está el costo real del registro (en la pantalla, en un archivo, en un socket, etc.). Pero eso es solo un costo que debes aceptar. Mi mejor práctica para eso, cuando sea práctico, es enrutar los mensajes de registro reales a una cola, que luego se recolecta y se envía al canal adecuado utilizando un hilo separado. Esto, al menos, ayuda a mantener el cierre de sesión fuera de línea con la computación principal, pero tiene sus propios costos y complejidad.

Otros consejos

Sé que este es un hilo antiguo, pero ¿qué hay de usar un enfoque que evite llenar el código con sentencias if basadas en el nivel de registro, como este? http://www.beefycode.com/post/Extension- Métodos para el formato de mensaje diferido en Log4Net.aspx

Al utilizar la expresión lambda para generar el mensaje, puedes evitar incluso evaluarlo por completo.

El log4net Preguntas frecuentes tiene una respuesta a esto , aunque no con el nivel de detalle que busca.

En resumen: use esas cláusulas de protección.

Dándole a Will Hartung la respuesta desde una perspectiva .NET :)

El código DebugFormat es:

if (IsDebugEnabled)
{
    Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
}

Básicamente, es lo mismo, así que creo que cuando usas DebugFormat no necesitas usar la cláusula de guardia (es posible que tengas una pequeña sobrecarga pero creo que es lo suficientemente pequeño como para ser ignorado)

hubiera dejado un comentario pero no tengo suficiente reputación: /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top