2010-03-09 19 views
11

hemos conectado nuestro log4net con Jira usando SMTP.Evite que log4net envíe problemas duplicados a través de SMTP

Ahora nos preocupa que, dado que el sitio es público, lo que podría pasarle al servidor Jira si tenemos muchos problemas en el entorno de producción.

Ya hemos filtrado en Critical y Fatal, pero queremos ver algún servicio de acumulador en log4net o un filtro simple que identifica los problemas que se repiten y evita que se envíen por correo electrónico. Preferiblemente sin tener que cambiar el código de informe de error, por lo que una solución de configuración sería lo mejor.

Supongo que volcar el registro en una base de datos y luego crear un oyente por separado algún código inteligente sería una alternativa (costosa).

Respuesta

14

Tal this es suficiente para sus necesidades:

que básicamente se limita el número de correos electrónicos que se envían en un lapso de tiempo determinado. Creo que debería ser bastante fácil personalizar esto para sus necesidades. Hice algo similar que incluso descarta mensajes dentro de un cierto intervalo de tiempo:

public class SmtpThrottlingAppender : SmtpAppender 
{ 
    private DateTime lastFlush = DateTime.MinValue; 
    private TimeSpan flushInterval = new TimeSpan(0, 5, 0); 

    public TimeSpan FlushInterval 
    { 
     get { return this.flushInterval; } 
     set { this.flushInterval = value; } 
    } 

    protected override void SendBuffer(LoggingEvent[] events) 
    { 
     if (DateTime.Now - this.lastFlush > this.flushInterval) 
     { 
      base.SendBuffer(events); 
      this.lastFlush = DateTime.Now; 
     } 
    } 
} 

El intervalo de vaciado se puede configurar como ajustes normales de otros appenders:

<flushInterval value="01:00:00" /> 
+0

Esto es asombroso – Hans

+0

No estoy seguro de si entiendo bien, pero ¿esperará esto y luego enviará un montón de correos electrónicos a la vez o enviará un correo electrónico con todos los eventos en él? ¿Qué hace 'base.SendBuffer (events)' hacer? Como el OP también está pidiendo "_un filtro simple que identifique los problemas que se repiten y evita que se envíen_", quizás esto podría hacerse eliminando elementos de la matriz 'events' antes de llamar a' base.SendBuffer (events) '. ¿Es esto correcto? – Ben

+0

Envía un correo electrónico con todos los eventos. Si lo necesita, puede eliminar ciertos eventos de la matriz antes de llamar a 'base.SendBuffer()'. –

4

También puede utilizar una llano SmtpAppender con log4net.Core.TimeEvaluator como el Evaluador.

Supongamos que tenemos un intervalo de 5 minutos y eventos a las 00:00, 00:01 y 01:00.

  • Stefan Egli's SmtpThrottlingAppender enviará correos electrónicos a las 00:00 (evento 1) y 01:00 (eventos 2 y 3).
  • Un SmtpAppender con TimeEvaluator enviará correos electrónicos a las 00:05 (eventos 1 y 2) y a la 01:05 (evento 3).

El que desee depende de si le preocupa más el retraso garantizado o el retraso potencialmente grande.

Intenté combinar el SmptThrottlingAppender con un TimeEvaluator, pero no pude obtener el comportamiento que quería. Estoy empezando a sospechar que debería escribir un nuevo ITriggeringEventEvaluator, no un nuevo IAppender.

+1

Leyendo el código fuente TimeEvaluator http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/TimeEvaluator.cs?revision = 1159605 & view = marcado, de la forma en que lo entiendo, TimeEvaluator desencadenará el envío a las 00:00 (evento 1), no se disparará a las 00:01 (porque no han transcurrido 5 minutos desde el disparo anterior) y luego se activará nuevamente en 01 : 00 (con el evento 2 y 3 dependiendo del tamaño del búfer, etc.) –

+0

Para ser más precisos, si se crea TimeEvaluator a las 00:00, entonces no enviará nada a las 00:00 ni a las 00:01 – irriss

Cuestiones relacionadas