2010-05-05 21 views
24

Tengo una aplicación que consiste en un host y módulos conectables (complementos).log4net - configurar usando múltiples archivos de configuración

Quiero ser capaz de configurar log4net para el host y para cada uno de los otros módulos. Cada uno de ellos debe tener su propio archivo de configuración y cada uno de ellos se registrará en un archivo diferente.

Solo el host tiene un archivo App.config. Los complementos tienen su propio archivo de configuración que contiene las secciones de configuración de log4net.

Llamar a XmlConfigurator.Configure desde uno de los complementos anula las definiciones de app.config log4net del host.

¿Hay una manera fácil de anexar configuraciones en lugar de anularlas?

Gracias, Gai.

Respuesta

2

Acabo de toparme con este problema yo mismo. Si bien no es exactamente lo que yo llamaría "ideal", creo que la mejor solución actualmente es utilizar el método ConfigureAndWatch de la clase XmlConfigurator. Básicamente, tiene su ensamblaje de host configurando la configuración de log4net usando un archivo de configuración específico. Cuando los complementos se carguen, pídales que escriban sus elementos de configuración en la sección de configuración de log4net en ese mismo archivo de configuración. Dado que a Log4net se le ha dicho que mire ese archivo para cambios con ConfigureAndWatch, cuando el archivo tenga esos nuevos datos agregados, log4net volverá a cargar la configuración que ahora incluirá los elementos de configuración de los complementos.

Esto es un poco hackish, pero parece funcionar. El siguiente paso, por supuesto, será mover esto a mi marco de registro para que el acceso al archivo de configuración esté federado.

Tenga en cuenta que hay un breve retraso entre la configuración del complemento se escribe/guarda y la configuración actualizada se vuelve a cargar y se aplica al depósito del registro.

+0

Gracias Stuart, voy a darle una oportunidad. – Gai

16

Parece que ya ha encontrado una solución que funcione para usted. Sin embargo, he encontrado una solución diferente que considero "más ideal", por lo que la publicaré aquí para quien encuentre esta pregunta en el futuro.

log4net tiene un concepto llamado repositorios que se pueden configurar por separado. No es muy popular ni muy bien documentado, pero aquí hay algunos documentos que encontré:

http://logging.apache.org/log4net/release/manual/repositories.html

De todos modos, todo lo que tiene que hacer es añadir RepositoryAttribute en su conjunto del plugin o asambleas con un nombre repositorio único para ese plugin y log4net lo mantendrá separado de todo lo demás.

4

Otra forma es tener múltiples archivos de configuración de log4net en múltiples lugares, cargarlos todos en un XDocument para componer efectivamente uno solo, y luego llamar al XmlConfigurator.Configure(). La forma en que lo hice fue crear cada archivo después del XSD para la configuración, cargar todos los elementos secundarios del nodo raíz de cada archivo log4net en instancias separadas de XElement y fusionarlas en un nuevo XDocument con un nodo raíz log4net. Actualizaré esta respuesta con el código (no está frente a mí en este momento) si alguien está interesado.

Encontrar los archivos es otra cuestión: utilizar algún tipo de convención para buscar archivos (por ejemplo *.dll.log4net.config), incrustarlos en las asambleas, o algo así.

Una implementación de dicho código se puede encontrar en:

www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net

+0

¿Cómo harías esto? Suena como una buena solución. Parece no trivial, ya que solo necesita conservar una sola etiqueta "log4net" y fusionar el contenido de esa etiqueta. – Wayne

+0

Actualicé mi respuesta con un poco más de detalle. Resulta que no se necesita demasiado código, y valió la pena por tener diferentes configuraciones de registro por entorno sin recurrir a pasos de compilación adicionales. – Kit

Cuestiones relacionadas