Estoy buscando sugerencias sobre la mejor manera de reconfigurar dinámicamente el nivel de registro Log4Net en mis aplicaciones ASP.NET. Generalmente utilizo una configuración simple en la que el registrador de raíz define el nivel de registro predeterminado, p.Reconfigurar dinámicamente Log4Net
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
y puede haber varios appenders, cada uno con filtros para definir los niveles de registro que utilizan.
La primera cosa que me gustaría ser capaz de hacerlo sería permitir a los administradores conectarse a una página de administración que les permite (a) ver el nivel actual para el registrador de la raíz y (b) de forma dinámica cambialo. No quiero usar "ConfigureAndWatch" y escribir en el archivo de configuración en el disco porque no quiero que estos cambios persistan cuando la aplicación se recicla.
Siguiente Quisiera ir más allá, y en una página de administración poder mostrar un TreeView con todos los registradores actuales que existen en la aplicación, y su nivel de registro actual. Y permita que el administrador pueda cambiar el nivel de registro de forma selectiva en cualquier nivel de la jerarquía.
La idea es crear una página de administración genérica que puedo poner en todas mis aplicaciones que permite a los administradores activar selectivamente el registro de nivel de depuración de forma dinámica para solucionar problemas.
Creo que las API de Log4Net son un poco confusas, ¿alguien puede señalar muestras o mostrar la mejor manera de lograr esto?
Actualización:
Ambas respuestas son igualmente buenas, así que he aceptado la primera - gracias. Para repetir, puedo conseguir todos los registradores actuales de la siguiente manera:
foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
{
log4net.Repository.Hierarchy.Logger logger =
(log4net.Repository.Hierarchy.Logger)log.Logger;
Debug.WriteLine(
String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
logger.Name,
logger.Parent.Name,
logger.Level == null ? "<null>" : logger.Level.Name,
logger.EffectiveLevel
)
);
}
EffectiveLevel es el nivel efectivo - Igual que el nivel si éste no es nulo, de lo contrario heredada del padre.
Al menos uno de los registradores devueltos anteriormente tendrá el registrador de raíz como principal, lo que me permite obtener una referencia al registrador de raíz.
Con lo anterior, debería ser posible reconstruir la jerarquía del registrador.
Actualización 2
Gracias de nuevo. Implementé un control de servidor ASP.NET que muestra la jerarquía del registrador en un TreeView con casillas de verificación, y permite al usuario cambiar dinámicamente el nivel de registro en cualquier nodo de la jerarquía. Funciona muy bien y lo pondré en la página de administración en todas mis aplicaciones de Web y servicios web de ASP.NET.
He probado el código anterior y se encontró que tenía que recorrer todos los repositorios, revisa con el tipo. foreach (repo var en LogManager.GetAllRepositories()) foreach (. Logger var en repo.GetCurrentLoggers() OfType()) logger.Level = Nivel; –
FYI: una vez me encontré con problemas de simultaneidad cuando uso la API de configuración dinámica de log4net; no parece ser seguro para subprocesos. – galaktor
con que versión de log4net fue esto? No veo ninguna implementación de ILog que pueda convertirse en Repository.Hierarchy.Logger –