Фильтрация сигнализируемых исключений из Elmah Error Mail

StackOverflow https://stackoverflow.com/questions/3406648

  •  25-09-2019
  •  | 
  •  

Вопрос

Я реализовал метод обертки вокруг сигнализации ошибок Эльмы, где поднятое исключение видна только Elmah для регистрации и рассылки, но теперь я хотел бы отфильтровать только эти сигнальные исключения из рассылки, но все еще регистрируют их. Как я могу это сделать?

Это моя простая обертка:

    public void LogException(Exception exception)
    {
        ErrorSignal.FromContext(HttpContext.Current).Raise(exception);
    }

Я подумал о обертывании входов исключения в пользовательском SignalledException и фильтрация из рассылки, но затем мои журналы полны SignalledExceptions, а не реальные исключения.

Любые другие идеи, пожалуйста?

Это было полезно?

Решение

Фильтрация Elmah работает в основном на типов исключений. Программная фильтрация позволит мне изучить информацию, добавленную в исключение, но мне еще предстоит посмотреть тип исключения с ElmahFilteringData Собственность, и я предпочитаю не «вторгаться» исключения, которые я хочу зарегистрироваться. Вот как я достиг только отправки уведомлений по электронной почте для определенных сигнальных исключений:

Сначала у меня есть специальное исключение обертки, чисто для того, чтобы рассказать Elmah не отправлять уведомление по электронной почте для исключения этого типа:

public class ElmahEMailBlockWrapperException: Exception
{
    public const string Explanation = "This is a wrapper exception that will be blocked by Elmah email filtering.  The real exception is the InnerException";
    public ElmahEMailBlockWrapperException(Exception wrappedException):base(Explanation, wrappedException) {}
}

Затем, когда я поднимаю исключение, я обычно хочу только войти и не по электронной почте, но, возможно, иногда по электронной почте, я использую этот код в моей службе регистрации исключений:

public void LogException(Exception exception, bool includeEmail)
{            
    if (includeEmail)
    {
        ErrorSignal.FromContext(HttpContext.Current).Raise(exception);
    }
    else
    {
        // Wrap the input exception in a special exception type that the Elmah email filter can block.
        var wrappedException = new ElmahEMailBlockWrapperException(exception);
        ErrorSignal.FromContext(HttpContext.Current).Raise(wrappedException);
    }
}

Теперь в мероприятиях фильтра Elmah в Global.Asax я развернул исключение, чтобы войти в систему, и если он обернут, уволить его из по электронной почте Уведомление:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    // If the exception was wrapped in a ElmahEMailBlockWrapperException exception to be blocked by the ErrorMail filter, the InnerException 
    // of the the ElmahEMailBlockWrapperException is the real exception to be logged, so we extract it, log it, and dismiss the wrapper.
    var ebw = e.Exception.GetBaseException() as ElmahEMailBlockWrapperException;
    if (ebw != null)
    {
        ErrorLog.GetDefault(HttpContext.Current).Log(new Error(ebw.InnerException));
        e.Dismiss();
    }
}

public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
{
    // If the exception was wrapped, i.e. raised only to be logged by Elmah and not emailed, dismiss it.
    if (e.Exception.GetBaseException() is ElmahEMailBlockWrapperException)
    {
        e.Dismiss();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top