Pergunta

Eu implementei um método de wrapper em torno da sinalização de erros de Elmah, onde uma exceção elevada é vista apenas pela Elmah para registrar e corresponder, mas agora eu gostaria de filtrar apenas essas exceções sinalizadas fora da correspondência, mas ainda os registram. Como posso fazer isso?

Este é o meu invólucro simples:

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

Pensei em encerrar a exceção de entrada em uma SignalLedException personalizada e filtrar aqueles fora do envio, mas meus logs ficam cheios de SignalLedExceptions, e não as exceções reais.

Alguma outra idéia, por favor?

Foi útil?

Solução

A filtragem Elmah funciona principalmente em tipos de exceção. A filtragem programática me permitiria examinar as informações adicionadas a uma exceção, mas ainda não encontrei um tipo de exceção com um ElmahFilteringData Propriedade, e eu prefiro não 'invadir' as exceções que quero registradas. Aqui está como eu realizei apenas enviando notificações por e -mail para certas exceções sinalizadas:

Primeiro, tenho uma exceção especial de invólucro, apenas para dizer a Elmah para não enviar uma notificação por e -mail para exceções desse tipo:

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) {}
}

Então, quando levanto uma exceção, normalmente quero apenas registrar e não enviar um e -mail, mas talvez às vezes enviado por e -mail, uso esse código no meu serviço de registro de exceção:

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

Agora, nos eventos do filtro Elmah em Global.asax, desembrulhei a exceção para registrá -lo e, se for embrulhada, descarte -o do pipeline de notificação por email:

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();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top