2009-10-05 12 views
8

Tenemos una aplicación que se ejecuta en varios subprocesos y utiliza Log4Net como marco de registro. Nos encontramos con un escenario en el que no se registraron algunos eventos de registro. Como se menciona en los documentos, el FileAppender y los otros Anexos son "no seguros para operaciones multiproceso". Busqué en la web soluciones o Anexadores, pero no pude encontrar ninguno.
¿Conoces un Appender de Log4Net seguro de múltiples hilos que usa un buffer en anillo o una cola para proporcionar soporte de múltiples hilos? ¿O deberíamos usar un marco de trabajo de registro seguro multihilo diferente?
¡Gracias de antemano!Registro seguro de subprocesos múltiples

+4

Duplicado de http://stackoverflow.com/questions/1294668 - básicamente, log4net usará el appender apropiadamente para usted. –

+0

Gracias por la respuesta. Escribí algunas pruebas de unidad que confirman la seguridad de múltiples hilos de Log4Net (consulte la respuesta a continuación). –

Respuesta

13

escribí algunas pruebas unitarias para reproducir el problema: Una prueba crea 50 hilos y cada uno de los registros de hilo de 500 mensajes. Después se contaron las líneas escritas y como resultado obtuve 25,000 (50 x 500) líneas en orden diferente. Lo probé en un doble núcleo y en una máquina de ocho núcleos.
I probó un Logger estática:

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger"); 

y con un registrador para cada instancia de la clase de prueba/hilo:

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString()); 


y todas las pruebas eran verdes.

Así que Log4Net funciona bien y maneja bien los escenarios de subprocesamiento múltiple. Los documentos de Appender deben actualizarse y declarar que las operaciones multiproceso son compatibles si la API de Logger se utiliza de la manera correcta.

Supongo que el problema con las entradas de registro faltantes que encontramos en la máquina de un cliente es causado por otros problemas. Tal vez la VM subyacente o el hardware están rotos.

¡Gracias por su ayuda!

8

Nunca he usado FileAppender y no puedo decir si es seguro para subprocesos, pero nunca he tenido ningún problema con RollingFileAppender. Los documentos indican que los miembros del tipo no son seguros para subprocesos, pero esto debería estar bien a menos que intentes escribir directamente al appender. No es necesario añadir su código de bloqueo de llama alrededor como:

log.Info("message"); 
+1

Sí, log4net bloquea automáticamente las llamadas de registro para que no haya ningún problema de subprocesamiento aquí. –

+0

Entonces, ¿está diciendo que Log4Net es seguro para múltiples subprocesos si se usa a través de la API Logger? ¿Entonces creo que tiene que haber un problema en nuestro código que lo esté usando?
En cada clase estamos creando un registrador como este:

  private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  

Pero solo se utiliza una instancia de esta clase en un hilo. –

0

Que las pruebas sean verdes no significa que las líneas se escribieron realmente en el archivo, pero que no hubo ninguna excepción. ¿O incluiste un cheque que también lee el archivo para eso en tu prueba? Me encontré con el mismo problema después de activar los jardines web en IIS. En ese punto, solo un hilo estaba escribiendo líneas en el archivo.

Más sobre múltiples hilos y log4net aquí: here y here

+3

Los escenarios de jardín web significan que IIS está utilizando procesos * múltiples *, que es diferente de * hilos * múltiples. Múltiples hilos escribiendo en FileAppender está bien; la escritura de múltiples procesos en FileAppender causará errores debido a cómo funcionan los sistemas de archivos. – Bleaourgh

0

El log4net es thread-safe, pero los appenders utilizado puede ser un problema. Los appenders del archivo hacen "bloquean" cuando están llamados. Esto significa que en su aplicación, cada registro enviado a Log4Net debe completar cada apéndice antes de volver a su aplicación.

Es seguro para subprocesos, muchos subprocesos pueden usar Log4Net para registrar mensajes, pero cuando se llama a Log4Net, la aplicación espera a que los complementos se completen. El tiempo de ejecución de registro se agrega a su tiempo de aplicación.

Esto se demuestra fácilmente. Ver: https://www.codeproject.com/Tips/1219696/Log-Net-Singleton-Wrapper-for-Concurrent-Logging

Lo que he hecho es "ajustar" las funciones de Log4Net en un singleton estático que es seguro para subprocesos y luego colocar cada mensaje de registro en cola ejecutándose en un hilo concurrente.Esto hace que todo el registro sea simultáneo a la aplicación, pero la ejecución de la aplicación no espera a que los complementos se completen.

Cuestiones relacionadas