Registro seguro multihilo

Tenemos una aplicación que se ejecuta en varios subprocesos y utiliza Log4Net como marco de registro. Nos encontramos con un escenario donde no se registraron algunos eventos de registro. Como se menciona en los documentos, FileAppender y los demás Anexos no son “seguros para operaciones multiproceso”. Busqué en la web soluciones o anexos, pero no pude encontrar ninguna.
¿Conoces un Log4Net Appender seguro para varios subprocesos que utiliza un búfer de anillo o una cola para proporcionar soporte para varios subprocesos? ¿O deberíamos usar un marco diferente de registro seguro multihilo en absoluto?
¡Gracias por adelantado!

Escribí algunas pruebas unitarias para reproducir el problema: una prueba crea 50 subprocesos y cada subproceso registra 500 mensajes. Luego se contaron las líneas escritas y, como resultado, obtuve 25,000 (50 x 500) líneas en un orden diferente. Lo probé en un doble núcleo y en una máquina de ocho núcleos.
He probado un registrador estático:

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 fueron verdes.

Así que Log4Net funciona bien y maneja bien los escenarios de multihilo. Los documentos de Appender deben actualizarse e indicar que las operaciones de subprocesos múltiples son compatibles si la API de Logger se utiliza de la manera correcta.

Supongo que el problema con la falta de entradas de registro que encontramos en la máquina de un cliente se debe a otros problemas. Tal vez la VM o hardware subyacente está roto.

¡Gracias por tu ayuda!

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 intente escribir directamente al appender. No es necesario que agregue su propio código de locking alrededor de llamadas como:

 log.Info("message"); 

El hecho de que las pruebas sean verdes no significa que las líneas se escribieron realmente en el archivo, sino que no hubo excepción. ¿O incluyó cheque que lee el archivo para eso también en su prueba? Encontré el mismo problema después de encender los jardines web en IIS. En ese momento solo un hilo escribía líneas en el archivo.

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

Log4Net es seguro para subprocesos, pero los agregadores utilizados pueden ser un problema. Los anexos de archivos se “bloquean” cuando se llaman. Esto significa que en su aplicación, cada registro enviado a Log4Net debe completar todos los agregadores antes de regresar a su aplicación.

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

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

Lo que he hecho es “envolver” las funciones de Log4Net en un singleton estático que es seguro para subprocesos y luego poner cada mensaje de registro en la cola que se ejecuta en un subproceso 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 agregadores se completen.