2010-03-09 6 views
11

nous avons ponté notre log4net avec Jira en utilisant SMTP.Empêcher log4net d'envoyer des problèmes en double via SMTP

Maintenant, nous sommes inquiets que le site soit public ce qui pourrait arriver au serveur Jira si nous avions beaucoup de problèmes dans l'environnement de production.

Nous avons déjà filtré sur Critical et Fatal, mais nous voulons voir soit un service d'acumulateur sur log4net, soit un filtre simple qui identifie les problèmes récurrents et les empêche d'être envoyés par e-mail. De préférence, sans avoir à modifier le code de signalisation d'erreur, une solution de configuration serait préférable. Je suppose que le fait de jeter le journal dans une base de données, puis de créer un programme d'écoute distinct, pourrait être une alternative (coûteuse).

Répondre

14

Peut-être this est suffisant pour vos besoins:

il limite essentiellement le nombre d'e-mails qui sont envoyés dans un laps de temps donné. Je pense qu'il devrait être assez facile de personnaliser cela à vos besoins. Je l'ai fait quelque chose de similaire que les rejets, même des messages dans un certain laps de temps:

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'intervalle de rinçage peut être configuré comme paramètres normaux d'autres appenders:

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

C'est génial – Hans

+0

Je ne sais pas si je comprends bien, mais est-ce que cela va attendre et envoyer un paquet d'emails en même temps ou est-ce qu'il envoie un email avec tous les événements qu'il contient? Que fait 'base.SendBuffer (events)'? Comme l'OP demande également "_un filtre simple qui identifie les problèmes récurrents et les empêche d'être envoyés" alors peut-être que cela pourrait être fait en supprimant des éléments du tableau 'events' avant d'appeler' base.SendBuffer (events) '. Est-ce correct? – Ben

+0

Il envoie un e-mail avec tous les événements. Si vous avez besoin, vous pouvez supprimer certains événements du tableau avant d'appeler 'base.SendBuffer()'. –

4

Vous pouvez également utiliser un SmtpAppender simple avec un log4net.Core.TimeEvaluator en tant qu'évaluateur. Supposons que nous ayons un intervalle de 5 minutes et des événements à 00:00, 00:01 et 01:00.

  • SmtpThrottlingAppender Stefan Egli va envoyer des emails à 00:00 (événement 1) et 01:00 (événements 2 et 3).
  • Un SmtpAppender avec un TimeEvaluator enverra des e-mails à 00:05 (événements 1 et 2) et 01:05 (événement 3).

La variable dépend du délai garanti ou du délai potentiellement important.

J'ai tenté de combiner le SmptThrottlingAppender avec un TimeEvaluator, mais je n'ai pas pu obtenir le comportement voulu. Je commence à soupçonner que je devrais écrire un nouvel ITriggeringEventEvaluator, pas un nouvel IAppender.

+1

Lire le code source de TimeEvaluator http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/TimeEvaluator.cs?revision = 1159605 & view = markup, comme je le comprends le TimeEvaluator déclenchera l'envoi à 00:00 (événement 1), ne se déclenchera pas à 00:01 (parce que 5 minutes ne se sont pas écoulées depuis le déclencheur précédent), puis se déclenchera à 01 : 00 (avec les événements 2 et 3 dépendant de buffersize, etc.) –

+0

Pour être plus précis, si TimeEvaluator est créé à 00:00, il n'enverra rien à 00:00 ni à 00:01 – irriss

Questions connexes