2009-11-13 11 views
8

Tengo varios procesos ejecutándose simultáneamente que deseo iniciar sesión en el mismo archivo.Registro desde múltiples procesos al mismo archivo usando Enterprise Library 4.1

Hemos estado utilizando Enterprise Library 4.1 Logging Application Block (con un RollingFlatFileTraceListener), y funciona bien, aparte del hecho de que antepone el GUID al nombre del archivo de registro cuando dos procesos intentan escribir en el archivo de registro en al mismo tiempo (una peculiaridad de System.Diagnostics.TextWriterTraceListener creo).

He intentado varias cosas, incluida la llamada al Logger.Writer.Dispose() después de escribir en el archivo de registro, pero no es ideal hacer una llamada de bloqueo cada vez que se escribe una entrada de registro.

Los foros EntLib sugieren el uso de MSMQ con un Servicio de Distribuidor, pero esa no es una opción ya que MSMQ no está permitido en mi empresa.

¿Hay alguna otra manera en la que pueda registrar de forma rápida y fácil desde múltiples hilos/procesos en el mismo archivo?

+0

¿Obtuviste una solución alternativa? tal vez usando *** MSMQ ***? – Kiquenet

+0

@Kiquenet ha pasado tanto tiempo, no lo recuerdo del todo. Si lo intento muy duro, recuerdo vagamente que terminamos usando diferentes archivos de registro para diferentes procesos para solucionar este problema. No es ideal, pero queríamos mantener las cosas simples. – Riko

+0

Podría agregar que si tuviera que elegir un marco de registro ahora, me mantendría lo más alejado posible de Enterprise Library. Es demasiado complejo, tanto para usar como para configurar, y no es fácilmente extensible. Probablemente vaya con [log4net] (https://logging.apache.org/log4net/) o [NLog] (http://nlog-project.org/). – Riko

Respuesta

4

Lo siento, pero la respuesta es no. File TraceListeners bloquea el archivo de salida para que solo un TraceListener pueda iniciar sesión en un archivo.

Puede probar otros Escuchadores de seguimiento que no estén basados ​​en archivos (por ejemplo, Base de datos, Registro de eventos).

Otra opción que puedo pensar sería escribir su propio servicio de registro (fuera de proceso) que se registraría en el archivo y acepta LogEntries. A continuación, cree un escucha de seguimiento personalizado que envíe un mensaje a su servicio.

Puede que no sea una buena idea, ya que tendría un poco de desarrollo personalizado además de que podría afectar el rendimiento ya que es una llamada fuera de proceso. Básicamente está configurando su propio servicio simplificado-pseudo-distribuidor.

+0

Esta es la misma conclusión a la que llegamos también. A largo plazo, probablemente escribamos un simple servicio de FireForge WCF para el registro, parece ser la única opción viable. Lástima. – Riko

2

EntLib bloquea el archivo de registro cuando se escribe en él. Por lo tanto, 2 procesos no pueden escribir en el mismo archivo de registro.

Cuando tuvimos este problema, que necesitábamos registrarnos desde muchos lugares diferentes, en el mismo lugar, hemos utilizado el registro de la base de datos.

Si está 100% atrapado en el registro de un archivo de texto, puede iniciar sesión en archivos de registro individuales y luego escribir un programa para fusionar estos archivos.

+0

Incluso 2 escuchas de seguimiento separados en el mismo proceso no pueden iniciar sesión en el mismo archivo. –

+0

Sí, el registro de la base de datos no es una opción para nosotros, no tenemos una.Por el momento, realmente vamos con archivos de registro individuales que fusionamos juntos. Pero eso será solo una solución a corto plazo. – Riko

1

Sé que esto es viejo, pero si todavía tiene curiosidad. log4net admite esto:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
+1

Gracias. Usar log4net en este proyecto no era una opción. Si fuera mi decisión, definitivamente la usaría sobre EntLib, el registro EntLib es demasiado abultado y difícil de entender. – Riko

0

El problema se produce cuando el grupo de aplicaciones recicla y permite la superposición de subprocesos. El hilo de cierre todavía lo tiene abierto, y el nuevo hilo obtiene el error. Intente desactivar el comportamiento de reciclaje superpuesto en IIS, o cree su propia versión del escritor de texto.

Cuestiones relacionadas