2011-03-31 9 views
54

¿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 esto:log4net: configurar para ignorar mensajes de una clase específica

private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass"); 

El problema es MyClass registra una cantidad extrema de los datos y se hace difícil encontrar información acerca de 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 establecer mi archivo configuration para ignorar los mensajes de una clase específica?

Respuesta

63

Claro, utilizar un filter.

He aquí el fragmento publicado en el blog, para futuras referencias - todo el crédito al autor de esa entrada en el 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> 
2

Es posible que desee para tratar de aplicar una categoría a sus propios mensajes Prueba este hilo: How to add category prefix to log4net message?

+0

Agradezco su sugerencia. Mi filtro no funcionaba hasta que lo moví antes de que el 'valor de archivo = ...' – leem

46

Un filtro ciertamente funciona, pero yo preferiría para apagar el registrador (registrador o jerarquía) directamente como t su:

<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 a continuación, la configuración mostrada sería deshabilitar el registro en todo el espacio de nombres. El segundo "ejemplo" desactiva el registro para su clase (según su pregunta).

+1

funciona con conjuntos de terceros? Intento ignorar los mensajes de RavenDb, hasta el momento no hay suerte – chester89

+0

afaik RavenDB usa NLog, por lo que cualquier configuración de log4net no tiene ningún efecto ... –

+0

Realmente logré hacerlo - al especificar el nombre completo de la clase que estaba registrando, de alguna manera el espacio de nombres con un asterisco no lo hizo – chester89

13

Sugeriría usar Filters también. Sin embargo, como me costó 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 está goning en este caso sería

log4net.Filter.LoggerMatchFilter ---- (Partidos contra un comienzo del nombre registrador.)

Sugerencia en el archivo config para Log4Net es importante dónde coloca sus etiquetas y la prioridad de ellas 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 se pueden tener varias appenders que se puede redirigir los resultados del registro de un registrador específico a un separada appender lugar de ignorarlos. Tal como uno appender para todos los registros y uno para los registros filtrados para un class específico.

Cuestiones relacionadas