2011-06-16 13 views
7

Acabo de empezar a utilizar log4net y tratar de entender la jerarquía de configuración y registro. ¿Esta jerarquía está basada en espacios de nombres o jerarquía de clases y métodos/funciones?Appender diferente por método

Digamos que tengo la siguiente estructura de clases ...

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 

    public void Method1() 
    { 
    log4net.info("message"); 
    } 

    public void Method2() 
    { 
    log4net.info("message"); 
    } 

} 

¿Es posible configuración en la configuración para el log4net.info en metodo1 utilizar uno appender y la log4net.info en el método 2 para use otro appender, incluso si están fuera del mismo tipo, por ejemplo SmtpAppender. Si es así, ¿cómo se vería la configuración? aquí está mi primer intento de hacerlo.

<appender name="SMTP1" type="log4net.Appender.SMTPAppender"> 
</appender> 
<appender name="SMTP2" type="log4net.Appender.SMTPAppender"> 
</appender> 


<logger name="MyClass.Method1"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP1" /> 
</logger> 
<logger name="MyClass.Method2"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP2" /> 
</logger> 

Respuesta

6

La jerarquía se basa en "nombres". Qué significa eso?
Bueno, puede especificar un espacio de nombres en su registrador xml (por ejemplo, Foo.Bar) y luego buscar un registrador para una clase en ese espacio de nombres utilizando el método GetLogger que toma un Type. Cualquier espacio de nombre "sub" en Foo.Bar heredará la configuración del registrador Foo.Bar.
Alternativamente, puede buscar un registrador basado en cualquier cadena anterior usando el método GetLogger que toma un string.

Puede buscar registradores de diferentes maneras. Más notablemente, por Type o por string.

Al poder buscar por string, realmente puede nombrar los registradores cualquier cosa y buscarlos usando cualquier cosa. Lo que tienes actualmente no funcionará porque log4net buscará el registrador según la clase ... por lo que usarás el mismo registrador para ambos métodos.

Por lo que se quiere hacer lo que tiene que crear dos registradores:

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method1"); 
    private static readonly ILog log2 = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method2"); 

    public void Method1() 
    { 
    log.info("message"); 
    } 

    public void Method2() 
    { 
    log2.info("message"); 
    } 
} 

Aquí es el mismo archivo XML registrador:

<logger name="MyClass.Method1"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP1" /> 
</logger> 
<logger name="MyClass.Method2"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP2" /> 
</logger> 

No estoy muy experimentado con. Net, entonces tal vez alguien pueda encontrar una forma mejor/más robusta de obtener los registradores para cada método usando algún Reflejo ninja, pero eso es lo mejor que podría hacer.

6

El mismo registrador no puede enrutar a múltiples anexos según el método actual, al menos no directamente. Sin embargo, lo que puede hacer es el uso de filtros log4net

a hacer lo que quiera. El marco log4net rellena cada LoggingEvent con el location information que necesita (por ejemplo, el nombre del método) para realizar el filtrado que desea. Sin embargo, probablemente necesite escribir un IFilter personalizado para filtrarlo. IFilter es una interfaz bastante trivial para implementar: 1 método/1propiedad. El método Decide() de su filtro toma 1 de 3 decisiones sobre cada evento de registro que se le pasa:

  • Denegar. Suelta el evento de registro. El evento no se registra y no se consultan filtros posteriores en la cadena de filtro para el appender.
  • Neutro. El evento de registro se pasa al siguiente filtro en la cadena de filtro para ese appender.
  • Aceptar. El evento está registrado. No se consultan filtros posteriores en la cadena de filtros.

Luego agregue su filtro a la cadena de filtros para cada apilador que desee tener. Eso se puede hacer sobre la marcha, o se puede configurar a través de su log4net.config.

Sin embargo, debe tener en cuenta que la calidad de la información de ubicación que obtiene depende de si es una versión de depuración o liberación ... y si, creo, tiene símbolos de depuración disponibles.

También puede ser que desee mirar en varios contextos de log4net (y el contexto pilas)

si necesita hacer añadir un poco de información contextual sobre la cual basar su filtración.

Cuestiones relacionadas