2009-08-07 13 views
9

Actualmente uso log4net con RollingFileAppender.C# entradas de la tienda log4net en la memoria y el correo electrónico bajo ciertas condiciones

Como cada llamada de registro se realiza Me gustaría almacenar esto en la memoria. Al final de la ejecución de mi aplicación de consola, me gustaría (si una configuración de app.config es verdadera) tomar solo las advertencias y las fatalidades y enviar todos estos mensajes en un correo electrónico. Noté MemoryAppender pero no estoy muy seguro de cómo usarlo. También vea SMTPAppender pero no estoy seguro de que sea la herramienta correcta, de lo contrario usaré MemoryAppender y de alguna manera filtraré solo eventos de Levels Warn/Fatal y luego enviaré correos electrónicos usando la clase SmtpClient.

¿Cómo lograr esto?

Gracias

Actualizar

Mi última parte de la configuración de log4net ahora se parece.

<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" > 
    <onlyFixPartialEventData value="true" /> 
    <threshold value="WARN" /> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="RollingFile" /> 
    <appender-ref ref="MemoryAppender" />  
    </root> 

En el código que hago:

private static MemoryAppender MemoryAppender 
{ 
    get 
    { 
       if (memoryAppender == null) 
       { 
        Hierarchy h = LogManager.GetRepository() as Hierarchy; 
        memoryAppender = h.Root.GetAppender("MemoryAppender") as MemoryAppender; 
       } 
       return memoryAppender; 
      } 
    } 

Entonces cuando quiero los eventos a los que llaman:

MemoryAppender.GetEvents();

He intentado MemoryAppender.GetEvents() [0] .RenderedMessage pero esa no es la salida correcta, cómo obtengo la cadena del mensaje tal como se escribió en los registros de File/Console con el patrón y el tiempo correctos etc y construirme un StringBuilder? Luego pondré esto en el cuerpo de mi correo electrónico y lo enviaré utilizando el SmtpClient. RenderMessage me está dando la cadena que se proporcionó a la llamada Log.Warn() no lo que se escribió en el registro. ¿Esto se debe a que no se establece un patrón de diseño en MemoryAppender?

Gracias

Respuesta

6

MemoryAppender solo se "agregará" a la memoria y, por lo tanto, es principalmente útil solo para fines de desarrollo y pruebas. Y actualmente no hay un appender que solo se anexe al cierre de la aplicación.

El SMTPAppender es algo intermedio, ya que hereda the BufferingAppenderSkeleton. Estos apéndices tienen una propiedad BufferSize que controla cuántos mensajes se mantienen en la memoria antes de que se vacíen.

Qué mensajes pasar a los appenders se controlan con la configuración de nivel en el elemento raíz o en elementos de registrador individuales. En tu caso usa un nivel de WARN que te permitirá pasar WARN, ERROR y FATAL. Si no quiere los mensajes de ERROR tendrá que poner un filtro de nivel en su appender.

Actualización: MemoryAppender no utiliza ningún diseño para "renderizar" objetos de mensaje. Lo que obtienes de MemoryAppender son solo los objetos de mensaje sin formato, ya que son producidos por log4net. Tendrá que convertirlos en texto significativo usted mismo.

Alternativamente, si necesita tanto funcionalidad de diseño como anexar en la memoria, puede consultar las subclases AppenderSkeleton. De esta forma obtienes el soporte básico de Layout. Al implementar el método Agregar, puede hacer lo que hace MemoryAppender, que simplemente se agrega a una lista interna de mensajes.

Actualización 2: para implementar la alternativa MemoryAppender sugiero tomar the MemoryAppender como punto de partida. MemoryAppender es una subclase de AppenderSkeleton y tiene acceso al método RenderLoggingEvent. Por lo tanto, nos subclase MemoryAppender y añadimos un método que hace que el lote actual de registro de eventos:

public class RenderingMemoryAppender : MemoryAppender 
{ 

    public IEnumerable<string> GetRenderedEvents() 
    { 
     foreach(var loggingEvent in GetEvents()) 
     { 
      yield return RenderLoggingEvent(loggingEvent); 
     } 
    } 
} 
+0

Hola Peter, gracias por tu ayuda, perdón por la demora. ¿Puedes echar un vistazo a mi actualización de la pregunta anterior, alguna idea? muy apreciado. – m3ntat

+0

También tenía razón. Quiero capturar WARN, ERROR y FATAL en la memoria. – m3ntat

+0

@ m3ntat - ver mi respuesta actualizada. Espero que ayude. –

1

Puede utilizar SMTPAppender y ver cómo funciona la funcionalidad ras. Log4net mantiene todos los mensajes en la memoria hasta que se llame a la descarga (si está configurada de esta manera), por lo que el correo electrónico se enviará cuando lo descargue.

Otra cosa que puede hacer es crear un appender independiente (Rolling o FileAppender) con los filtros WARN y FATAL, luego conecte este appender al mismo registrador, y al final de su ejecución envíe este archivo por correo electrónico si no está vacío (y puede elegir enviarlo como un archivo adjunto o directamente en el cuerpo del correo electrónico). Déjame saber si quieres más detalles, esto es casi lo mismo que estoy haciendo saber.

Buena suerte!

Ricardo.

+0

Hola Ricardo, gracias por su ayuda, lo siento por el retraso. ¿Puedes echar un vistazo a mi actualización de la pregunta anterior, alguna idea? muy apreciado. – m3ntat

Cuestiones relacionadas