2010-03-09 9 views
11

abbiamo collegato il nostro log4net con Jira usando SMTP.Prevenire log4net per inviare problemi duplicati via SMTP

Ora siamo preoccupati che, poiché il sito è pubblico, cosa potrebbe accadere al server Jira se ci sono molti problemi nell'ambiente di produzione.

Abbiamo già filtrato su Critico e Fatale, ma vogliamo vedere sia un servizio di acumulator su log4net o un filtro semplice che identifica i problemi ricorrenti e impedisce loro di essere inviati tramite e-mail. Preferibilmente senza dover modificare il codice di segnalazione degli errori, quindi una soluzione di configurazione sarebbe la migliore.

Immagino che scaricare il log in un file db e quindi creare un listener separato un codice smart sarebbe un'alternativa (pacchiana).

risposta

14

Forse this è sufficiente per le vostre esigenze:

si limita sostanzialmente il numero di messaggi di posta elettronica che vengono inviati in un determinato arco di tempo. Penso che dovrebbe essere abbastanza facile personalizzarlo in base alle tue esigenze. Ho fatto qualcosa di simile che anche scarta i messaggi entro un certo periodo di tempo:

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; 
     } 
    } 
} 

L'intervallo di filo può essere configurato come normali impostazioni di altri appenders:

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

Questo è fantastico – Hans

+0

Non so se ho capito bene, ma questo attenderà e poi invierà un pacco di email tutte in una volta o invierà una mail con tutti gli eventi in essa contenuti? Cosa fa 'base.SendBuffer (eventi)'? Poiché l'OP chiede anche "_un filtro semplice che identifica i problemi ricorrenti e impedisce loro di essere inviati_" allora forse questo potrebbe essere fatto rimuovendo gli elementi dalla matrice 'events' prima di chiamare' base.SendBuffer (eventi) '. È giusto? – Ben

+0

Invia una email con tutti gli eventi. Se è necessario, è possibile rimuovere determinati eventi dall'array prima di chiamare 'base.SendBuffer()'. –

4

È possibile anche utilizzare un semplice SmtpAppender con un log4net.Core.TimeEvaluator come Evaluator.

Supponiamo di avere un intervallo di 5 minuti e di eventi alle 00:00, alle 00:01 e alle 01:00.

  • SmtpThrottlingAppender di Stefan Egli invierà e-mail alle 00:00 (evento 1) e 01:00 (eventi 2 e 3).
  • Un SmtpAppender con TimeEvaluator invierà e-mail alle 00:05 (eventi 1 e 2) e 01:05 (evento 3).

Quale si desidera dipende se si è più infastiditi dal ritardo garantito o dal ritardo potenzialmente elevato.

Ho tentato di combinare SmptThrottlingAppender con TimeEvaluator, ma non ho potuto ottenere il comportamento che volevo. Sto iniziando a sospettare che dovrei scrivere un nuovo ITriggeringEventEvaluator, non una nuova IAppender.

+1

Lettura del codice sorgente TimeEvaluator http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/TimeEvaluator.cs?revision = 1159605 & view = markup, il modo in cui lo capisco il TimeEvaluator attiverà l'invio alle 00:00 (evento 1), non innescherà alle 00:01 (perché 5 minuti non sono passati dal trigger precedente), e poi si innescherà di nuovo a 01 : 00 (con evento 2 e 3 a seconda del buffer ecc.) –

+0

Per essere più precisi, se TimeEvaluator viene creato alle 00:00, non invierà nulla alle 00:00 né alle 00:01 – irriss

Problemi correlati