c# - txt - Cambiar el nivel de registro log4net mediante programación
log4net install (5)
Estaba buscando el mismo enfoque y descubrí que la última versión de NLog 3.2.0.0 ofrece la siguiente opción para cambiar el nivel de registro en el tiempo de ejecución.
LogManager.GlobalThreshold = LogLevel.Debug;
Creo que otro enfoque podría ser utilizar LogManager.Configuration
para sobrescribir la configuración de configuración utilizando variables.
Esto es similar al 650694 pero no se aceptó ninguna respuesta, no puedo hacer que ninguna de esas sugerencias funcione, y sospecho que puedo estar en una situación ligeramente diferente.
Estoy llamando a log4net.Config.XmlConfigurator.Configure (). Pero después de ese punto en el programa, quiero cambiar el umbral de registro a un valor solo conocido en tiempo de ejecución.
De la otra pregunta, intenté:
((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error;
y:
var appender = new log4net.Appender.ColoredConsoleAppender();
appender.Layout = new log4net.Layout.PatternLayout(@"%date %-5level %message%newline");
appender.Threshold = log4net.Core.Level.Error;
appender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(appender);
pero ninguna de las dos parece tener ningún efecto: sigo viendo las declaraciones de DEPURACIÓN e INFO de registro en la consola.
Mi corazonada es que estoy agregando un nuevo appender, que no tiene ningún efecto en el appender declarado en la configuración XML (que le dice que imprima mensajes de nivel DEBUG), pero todavía no tengo ninguna evidencia para esto.
Estuve investigando la API log4net por un tiempo, y simplemente no lo veo. ¿Hay algo simple que me estoy perdiendo?
Finalmente encontré una solución de trabajo, here .
Las piezas grandes fueron:
- necesita establecer el umbral en todos los registradores, incluido el registrador de raíz "no se puede recuperar por nombre"
- necesita obtener el Nivel del LevelMap de la Jerarquía
Muchas gracias a Eddie por hacerme buenas preguntas, lo que me llevó a buscar las palabras correctas. Nunca hubiera imaginado esto solo.
(Aparte: Repository, Hierarchy, Logger, RootLogger, LevelMap - No tenía idea de que fuera posible incluso hacer una biblioteca de registro de este complejo. Tiene alrededor de 20 capas de direccionamiento indirecto, lo que estoy seguro lo hace lo suficientemente flexible para cualquier cosa, pero hace que sea casi imposible hacer cosas simples como "no registrar ningún mensaje por encima del umbral X". ¡Gah!)
Hay una manera simple de hacerlo:
LogManager.GetRepository().Threshold = Level.Info;
Más información se puede encontrar here .
Intenté todas estas respuestas y ninguna de ellas funcionó. En el depurador pude ver que todos los niveles de registrador, niveles de raíz, umbrales se configuraron como se indica. A pesar de eso, no vi ningún cambio de nivel de registro en el archivo continuo al que estaba ingresando.
Luego encontré que en el archivo de configuración el elemento appender también especificaba un valor de umbral. Entonces cuando quise cambiar el nivel a Debug mientras el appender estaba configurado en Warn, por ejemplo, ese appender no recogió mensajes adicionales ya que estaban por debajo del umbral. Así que eliminé el umbral de la configuración del apéndice y simplemente mantuve la configuración de nivel.
<root>
<level value="Warn" />
<appender-ref ref="RollingFile" />
</root>
Luego terminé usando la solución de Ken para cambiar el nivel en tiempo de ejecución.
Ninguna de estas soluciones aquí presente funcionó para mí. No estaba cambiando en tiempo de ejecución
Esto es lo que funcionó para mí:
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug;
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty);
Tienes que llamar a RaiseConfigurationChanged después de hacer cambios en su configuración.