2010-10-30 25 views
9

Acabo de comenzar a jugar con Log4Net ... Ahora quiero enviar un correo electrónico con el registro completo adjunto o directamente en el correo. El problema con el uso de SmtpAppender es que requiere un bufferSize que será desconocido porque debe enviar el correo si está lleno de errores o solo información.Log4Net + ¿Enviar correo electrónico cuando haya terminado?

Actualización: Mi archivo de configuración

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> 

    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Backup Application - Log" /> 
    <smtpHost value="mailserver" /> 
    <authentication value="1" /> 
    <username value="userName" /> 
    <password value="mypw" /> 

    <port value ="25"/> 
    <lossy value="true" /> 
    <bufferSize value="500" /> 

    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ALL"/> 
    </evaluator> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%timestamp [%thread] %-5level %logger – %message%newline" /> 
    </layout> 

</appender> 

Respuesta

16

BufferSize es igual al número de mensajes de registro que tienen que ser amortiguada (es decir, si se establece a 512 el correo se enviará una vez 512 mensajes se han recogido) .

Creo que establecerlo en int.MaxValue (que es 2.147.483.647) es una opción razonable. 2 mil millones de mensajes son demasiado para un sistema, incluso de larga duración.

Si me das 10 minutos os (desde el código fuente) Te confirmo que si limpia detener su aplicación, todos los registros recogidos hasta el momento se enviarán

[Actualización]: confirmó! ! Destructor vacía la cola como se esperaba

[Agregar] Quitaría tanto lossy como evaluador. Su problema es claro: el evaluador tiene prioridad sobre el búfer :) :)

El evaluador se utiliza para enjuagar la cola cuando se cumple una determinada condición. Su condición es igual a true. Cuando se activa esta condición, se envía el correo electrónico, por lo que este es el motivo por el que se envía el correo en cada llamada de registro.

Esto es ligeramente diferente de enviar SOLAMENTE información y mensajes de error, que se logra mediante el filtrado de registros.

Elimina los dos atributos y tu código funcionará. Establecer int.MaxValue le permitirá almacenar la mayor cantidad posible de mensajes. Es poco probable (será mejor que ganes el premio mayor de 178 millones de euros de Superenalotto como hicieron algunos muchachos esta noche, o ser golpeado por un cometa en tu cabeza) que una aplicación recolecta más de 2 mil millones de errores/información en una carrera.

+0

Creo que ese es el problema .. No "limpio" mi aplicación (no sé cómo hacerlo) – ebb

+0

Si su aplicación falla, está sujeto a la pérdida de mensajes. Este es un problema muy común en el registro general, y debido a eso debes ** evitar siempre ** almacenar en el búfer mensajes en una aplicación defectuosa. Por cierto, una parada "limpia" es una parada sin excepción no controlada. Si intentas coger tu método principal, será una parada limpia cuando detectas un error –

+0

Estoy usando try-catch. Pero el problema es que todavía quiero que el registro se envíe por correo, ya sea que esté lleno de errores o solo información. – ebb

Cuestiones relacionadas