限制Elmah发送的电子邮件数量

有没有人知道如何通过健康监测来限制Elmah在一段时间内发送的电子邮件数量的好方法?

我希望能够将每个页面的每个错误的电子邮件限制为每小时约一封电子邮件,以便针对该特定错误和页面。

查看elmah文档,它看起来像使用:

void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e) { // perform filtering here } 

在global.ascx文件中可能是一个选项。 我可以为每个应用程序设置一个静态对象,其中包含一些错误详细信息和记录的时间并检查它并在需要时取消电子邮件通知?

有没有人有更好的解决方案或他们现在使用的例子?

我用你问题中的相同方法写了这个。 似乎工作得很好。

 public static DateTime RoundUp(this DateTime dt, TimeSpan d) { return new DateTime(((dt.Ticks + d.Ticks - 1) / d.Ticks) * d.Ticks); } static ConcurrentDictionary> _concurrent = new ConcurrentDictionary>(); ///  /// This is an Elmah event used by the elmah engine when sending out emails. It provides an opportunity to weed out /// irrelavent emails. ///  ///  ///  protected void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e) { preventSpammingDigestEmail(e); } ///  /// Prevents spamming by throttling emails to 5 minute intervals. ///  ///  private static void preventSpammingDigestEmail(ExceptionFilterEventArgs e) { DateTime roundedTimeStamp = DateTime.Now.RoundUp(TimeSpan.FromMinutes(5)); string serialisedException = Util.SerializeException(e.Exception); var lastRaisedException = new KeyValuePair (roundedTimeStamp, serialisedException); int key = lastRaisedException.GetHashCode(); bool errorHasAlreadyBeenRaised = _concurrent.ContainsKey(key); // If event has already been raised in the last five minutes dont raise again if (errorHasAlreadyBeenRaised) { e.Dismiss(); return; } // Record that it has been raised _concurrent.TryAdd(key, lastRaisedException); // Clean up existing entries Task.Factory.StartNew(() => { var toRemove = _concurrent.Where(pair => pair.Value.Key < DateTime.Now.Date).Select(pair => pair.Key).ToArray(); foreach (var i in toRemove) { KeyValuePair keyValuePair; _concurrent.TryRemove(i, out keyValuePair); } }); } 

我不知道Elmah是否具备这种能力(文档没有提到它),但ASP.NET的健康监测确实如此: http : //aspnet.4guysfromrolla.com/articles/032107-1.aspx

我最终为我的CMS编写了自己的事件记录,通知和汇总系统……我对每个exception的堆栈跟踪进行了哈希处理并使用它来“汇总”类似的事件(一个Web应用程序可以在更少的情况下获得成千上万的exception如果出现问题,不要一秒钟。

我将通知期限配置为1天 – 我每天只收到第一个错误实例的通知。 始终保存最新的错误实例,但旧的实例会被“清理”到最后20个左右,具体取决于频率等。

它与身份validation系统集成,因此管理员/开发人员可以获得他们订阅的事件的“收件箱”,并可以实时查看调试信息,同时防止未经身份validation的用户查看任何调试信息。

真的很好……因为它是通用的,它也适用于非错误事件,如出版物,用户更改通知等。

我很好奇是否有人会对作为图书馆曝光的那种系统感兴趣?

我有类似的问题,并选择使用ELMAH的log-to-SQL方法。 我在我的Web服务器上使用了SQLExpress 2008(免费版),然后设置SQL Reporting每天早上发送摘要电子邮件。

此方法不需要编码,只需设置SQL服务器和报告服务。 它的好处是可以让您运行几个月的错误日志报告,而不是每天只看到它们。 此外,您可以根据需要随时安排报告。

ELMAH wiki页面包含有关如何设置web.config以指向SQL Server的信息。 一旦数据在SQL中,有很多选项可以获取数据,但我发现SQL Express报告服务非常适合我的需求。

这个编码复合项目ASP.NETexception报告是Elmah的包装看起来很有希望。 http://aspexceptionreporter.codeplex.com/