2009-10-23 11 views
5

Mi aplicación utiliza varios subprocesos con nombres bien definidos (es decir, no un grupo de subprocesos con subprocesos "anónimos"). En este momento, todos estos subprocesos envían sus mensajes de registro a un archivo, y aunque la identificación del subproceso es parte de la línea de registro, esto dificulta el análisis del comportamiento de la aplicación. Por lo tanto, quiero que cada hilo inicie sesión en su propio archivo de registro.¿Cómo iniciar sesión en archivos separados por hilo con Log4Net?

Parece que Log4Net no ofrece una opción incorporada para elegir un appender basado en el hilo. ¿Alguien sabe de una solución para esto? Tenga en cuenta que, obviamente, preferiría no cambiar a otra biblioteca de registro.

+0

¿Qué terminaste haciendo con esto? Tengo exactamente el mismo requisito, excepto que el número de subprocesos y los nombres de los subprocesos no se conocen o establecen hasta el tiempo de ejecución. –

+0

No resolví el problema porque conseguí un nuevo trabajo. De todos modos, la solución de Peter hubiera funcionado para mí, y me imagino que crear la configuración de appender a través de la API funciona para usted. –

+0

Si alguien más necesita una solución simple, vea la respuesta aquí http://stackoverflow.com/questions/6956064/logging-to-an-individual-log-file-for-each-individual-thread –

Respuesta

3

La forma log4net de "elegir" appenders es mediante el filtrado. En su escenario, necesitaría una forma de configurar un número de apéndices, cada uno representando un hilo bien definido, y tener filtros en cada apéndice que pasa a través de los mensajes solo desde su hilo respectivo.

Dado que la identificación del subproceso no es determinista, necesitará algo más para filtrar. Supongo que está controlando la creación de estos subprocesos usted mismo y sugiere que cada subproceso registre un identificador en una propiedad en the ThreadContext. A continuación, puede usar the PropertyFilter para filtrar los mensajes según los identificadores.

Aquí hay una configuración de configuración de muestra que tiene dos appenders, cada anexando mensajes donde el valor actual de la propiedad threadId coincide con un identificador dado.

<appender name="x"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadX" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<appender name="y"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadY" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<root> 
    <appender-ref name="x" /> 
    <appender-ref name="y" /> 
</root> 
+0

¿Cómo le va? esto si la cantidad de hilos y sus nombres no se conocían hasta el tiempo de ejecución? –

+2

@goku_da_master puede crear la configuración del apéndice en el código, ese podría ser un enfoque, al menos si tiene el control de la creación del hilo. De lo contrario, diría que la mejor opción es iniciar sesión en una fuente común (por ejemplo, una base de datos) que se pueda consultar más fácilmente en función de la id. Del subproceso. –

Cuestiones relacionadas