c# - logger - log4net levels
log4net: Configure para ignorar mensajes de una clase especĂfica (4)
Claro, usa un filter.
Aquí está el fragmento publicado en el blog, para referencia futura: todo el crédito al autor de esa publicación del blog:
<filter type="log4net.Filter.LoggerMatchFilter">
<!-- allows this sub-namespace to be logged... -->
<loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
<!-- ...but not the rest of it -->
<loggerToMatch value="Noisy.Namespace" />
<acceptOnMatch value="false" />
</filter>
¿Hay alguna manera de que la configuración de log4net ignore una clase específica? Por ejemplo, generalmente creamos un registro en cada clase. Similar a ésto:
private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");
El problema es que MyClass
registra una cantidad extrema de datos y se vuelve difícil encontrar información sobre otras clases. Es otro desarrollador que usa MyClass
así que no puedo entrar y cambiar los archivos de registro, pero en mi entorno me gustaría ignorarlos.
¿Puedo configurar mi archivo de configuration
para que ignore los mensajes de una clase específica?
Es posible que desee intentar aplicar una categoría a sus propios mensajes Pruebe este hilo: ¿Cómo agregar el prefijo de categoría al mensaje log4net?
Sugeriría usar Filters también. Sin embargo, dado que tuve problemas para encontrar la imagen completa cuando estaba tratando de implementar el filtro, estoy publicando un fragmento de muestra del Configutation file
que creé, que indica dónde van los filtros.
El filtro que está buscando en este caso sería
log4net.Filter.LoggerMatchFilter ---- (Coincide con el inicio del nombre del registrador).
Sugerencia en el archivo de config
para Log4Net , es importante dónde coloca sus etiquetas y la prioridad de las mismas realmente importa. Entonces, en este caso, la etiqueta <filter>
viene después de la etiqueta de apertura <appender>
y antes de su etiqueta <file value = ... />
.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFile.PassedDevices" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="Foo.namespace.bar.mySubclass" />
<acceptOnMatch value="false" />
</filter>
<file value="myPassedDevices.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%timestamp %level - %message [%thread] %logger%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFile" /> <!-- My other appender which logs all and I cut it out in this snippet. Remember that you should reference all your appenders in this tag to make them work.-->
<appender-ref ref="RollingFile.PassedDevices" />
</root>
</log4net>
</configuration>
En esta técnica, puede tener múltiples appenders
que pueden redirigir los resultados de registro de un registrador específico a un appender
separado en lugar de ignorarlos. Como un appender
para todos los registros y uno para los registros filtrados para una class
específica.
Un filtro ciertamente funciona, pero preferiría apagar el registrador (o la jerarquía del registrador) directamente así:
<logger name="YourNameSpace.WithNoLogging" additivity="false">
<level value="OFF" />
</logger>
<logger name="MyClass" additivity="false">
<level value="OFF" />
</logger>
<root>
<level value="ALL" />
<appender-ref ref="YourAppender" />
</root>
Suponiendo que YourNameSpace.WithNoLogging
es un espacio de nombres, la configuración mostrada inhabilitará el inicio de sesión en todo el espacio de nombres. El segundo "ejemplo" desactiva el registro para su clase (según su pregunta).