2010-04-14 18 views
7

Estoy usando log4net para registrar el progreso de mi aplicación web, usando Log4PostSharp para AOP-injectify todos los métodos. Esto tiene el efecto deseado de registrar (casi) todo y está bien.Filtrar log4net en el nombre del método - no puedo conseguirlo

Ahora tengo el requisito de registrar JUST los métodos Page_Load en un archivo/consola. Obviamente puedo hamster la clase log4postsharp para hacer eso, pero luego estaría perdiendo todo el otro registro.

He estado buscando filtros en log4net, comenzando con el filtro StringMatch, pero eso solo mira el mensaje que se está registrando, y estoy buscando el nombre del método. Esto me puso en el PropertyFilter, pero todavía sin alegría. Mi fragmento log4net.config es así:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="LocationInfo.MethodName"/> 
    <stringToMatch value="Page_Load"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file value="d:\\xxxx\\yyyyy\\zzzzLog"/> 

Como se puede ver, estoy tratando de llave en la MethodName del registro de eventos a través de locationInfo, pero todavía estoy consiguiendo todo conectado. EDITAR: Como se mencionó en los comentarios, ahora he incluido el DenyAllFilter que agregué después de RTFM ;-)

¿Alguien puede ayudar?

Gracias,

Mike K.

+0

NB: He añadido ahora después del filtro para dejar todo lo demás que se registra una vez que consigo el filtro de nombre de método que trabaja –

+0

¿Ha agregado DenyAllFilter? ¿Obtienes todo o nada registrado entonces? debe actualizar su pregunta para reflejar su progreso. –

Respuesta

4

Por lo que yo puedo decir log4net no conoce un LocationInfo.MethodName propiedad. No estoy usando Log4PostSharp, por lo que no puedo decir con certeza si Log4PostSharp creará esta propiedad.

me gustaría escribir mi propio filtro como este para filtrar por los nombres de método (parte de expresiones regulares omitido):

public class MethodNameFilter : StringMatchFilter 
{  
    override public FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
     if (loggingEvent == null) 
     { 
       throw new ArgumentNullException("loggingEvent"); 
     } 

     var locationInfo = loggingEvent.LocationInformation; 

     // Check if we have been setup to filter 
     if (locationInfo == null || (m_stringToMatch == null && m_regexToMatch == null)) 
     { 
      // We cannot filter so allow the filter chain 
      // to continue processing 
       return FilterDecision.Neutral; 
     } 

     if (m_stringToMatch != null) 
     { 
      // Check substring match 
      if (locationInfo.MethodName.IndexOf(m_stringToMatch) == -1) 
      { 
        // No match, continue processing 
        return FilterDecision.Neutral; 
      } 

      // we've got a match 
      if (m_acceptOnMatch) 
      { 
        return FilterDecision.Accept; 
      } 
      return FilterDecision.Deny; 
     } 
     return FilterDecision.Neutral; 
    } 
} 

Nota: Acceso a locationInfo es caro y puede tener un efecto notable en el rendimiento. Podría considerar modificar Log4PostSharp para extraer el nombre del método durante el tejido y almacenarlo en alguna propiedad. En ese caso, podría usar el filtro de propiedad como lo desea y no tendría ningún impacto en el rendimiento. No estoy seguro de si esto realmente funciona, pero esperaría que esto sea posible.

La configuración sería algo como esto:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <filter type="YourNameSpace.MethodNameFilter"> 
     <stringToMatch value="Page_Load"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file value="d:\\xxxx\\yyyyy\\zzzzLog"/> 
+0

¿Dónde/cómo se pasaría m_stringToMatch? –

+0

Configura este nuevo filtro de la misma manera que el filtro de propiedades. Simplemente no necesita tener la parte . ver también mi respuesta revisada. –

+0

Gracias, tenga un Bounty ;-) –

Cuestiones relacionadas