Ограничение количества писем, отправляемых Elmah

Кто-нибудь знает хороший способ ограничить количество электронных писем, отправляемых Elmah в течение определенного периода времени, как это можно сделать с помощью Health Monitoring?

Я хочу иметь возможность ограничить электронные письма для каждой ошибки с каждой страницы только по электронной почте один раз в час или около того для этой конкретной ошибки и страницы.

Глядя на документацию elmah, это похоже на использование:

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

в файле global.ascx может быть вариантом. Я мог бы настроить статический объект для каждого приложения, который содержит некоторые сведения об ошибке и зарегистрированное время, проверить его и отменить уведомление по электронной почте, если это необходимо?

У кого-нибудь есть лучшее решение или пример того, что они используют сейчас?


person beckelmw    schedule 04.01.2010    source источник


Ответы (4)


Я написал это, используя тот же метод, что и в вашем вопросе. Кажется, работает хорошо.

public static DateTime  RoundUp(this DateTime dt, TimeSpan d)
{
    return new DateTime(((dt.Ticks + d.Ticks - 1) / d.Ticks) * d.Ticks);
}
static ConcurrentDictionary<int, KeyValuePair<DateTime, string>> _concurrent = new ConcurrentDictionary<int, KeyValuePair<DateTime, string>>();

/// <summary>
/// This is an Elmah event used by the elmah engine when sending out emails. It provides an opportunity to weed out 
/// irrelavent emails.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
{
    preventSpammingDigestEmail(e);
}

/// <summary>
/// Prevents spamming by throttling emails to 5 minute intervals.
/// </summary>
/// <param name="e"></param>
private static void preventSpammingDigestEmail(ExceptionFilterEventArgs e)
{
    DateTime roundedTimeStamp = DateTime.Now.RoundUp(TimeSpan.FromMinutes(5));
    string serialisedException = Util.SerializeException(e.Exception);

    var lastRaisedException = new KeyValuePair<DateTime, string>
        (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<DateTime, string> keyValuePair;
                _concurrent.TryRemove(i, out keyValuePair);
            }
        });
}
person Mantisimo    schedule 15.07.2013
comment
Я действительно не хочу загрязнять ответ, но вот код. открытый класс Util { частная статическая строка SerializeException (Exception e, string exceptionMessage = string.Empty) { if (e == null) return String.Empty; exceptionMessage = String.Format( {0}{1}{2}\n{3}, exceptionMessage, (exceptionMessage == String.Empty) ? String.Empty : \n\n, e.Message, e.StackTrace); if (e.InnerException != null) exceptionMessage = SerializeException(e.InnerException, exceptionMessage); вернуть сообщение об исключении; } } - person Mantisimo; 13.12.2014

Я не знаю, есть ли у Elmah такая возможность (в документации она не упоминается), но мониторинг работоспособности ASP.NET есть: http://aspnet.4guysfromrolla.com/articles/032107-1.aspx

В итоге я написал свою собственную систему регистрации событий, уведомлений и сводных данных для своей CMS... Я хеширую трассировку стека каждого исключения и использую ее для «свертывания» похожих событий (веб-приложение может получить тысячи исключений за меньшее время). секунды, если что-то пойдет не так).

Я настроил период уведомления на 1 день — каждый день я получаю уведомление только о первом случае ошибки. Последний экземпляр ошибки всегда сохраняется, но более старые экземпляры «очищаются» до последних 20 или около того, в зависимости от частоты и т. д....

Он интегрируется с системой аутентификации, поэтому администраторы/разработчики получают «входящие» события, на которые они подписаны, и могут просматривать информацию об отладке в режиме реального времени, при этом пользователи, не прошедшие проверку подлинности, вообще не видят никакой информации об отладке.

Действительно приятно... И поскольку он общий, он работает и для событий, не связанных с ошибками, таких как публикации, уведомления об изменении пользователя и т. д.

Мне любопытно, будет ли кому-нибудь интересна такая система, представленная в виде библиотеки?

person Lilith River    schedule 04.01.2010
comment
Думаю, людям было бы интересно, по крайней мере, мне. - person beckelmw; 05.01.2010

У меня была аналогичная проблема, и я решил использовать метод log-to-SQL для ELMAH. Я использовал SQLExpress 2008 (бесплатная версия) на своем веб-сервере, а затем настроил SQL Reporting для отправки сводных электронных писем каждое утро.

Этот метод не требует написания кода, только настройка SQL-сервера и служб отчетов. Его преимущество заключается в том, что вы можете запускать отчеты по журналам ошибок за месяцы, а не просто просматривать их ежедневно. Кроме того, вы можете планировать отчеты так часто, как вам нравится.

На вики-странице ELMAH есть информация о том, как настроить файл web.config, чтобы он указывал на SQL. сервер. Есть много вариантов для получения данных, когда данные находятся в SQL, но я считаю, что службы отчетов SQL Express идеально подходят для моих нужд.

person Ken Pespisa    schedule 04.01.2010
comment
Это кажется разумным. У меня просто нет такого доступа в этой конкретной ситуации, хотя для моих собственных проектов я могу пойти по этому пути. - person beckelmw; 05.01.2010

Этот кодовый проект ASP.NET Exception Reporting, который является оболочкой для Elmah, выглядит многообещающе. http://aspexceptionreporter.codeplex.com/

person beckelmw    schedule 04.01.2010