Pregunta

He implementado un método de envoltura alrededor de Elmah error de señalización, donde una excepción planteada sólo se ve por Elmah para el registro y envío por correo, pero ahora me gustaría filtro sólo estas excepciones señaladas fuera del correo, pero todavía registrarlos . ¿Cómo puedo hacer esto?

Esta es mi sencilla envoltorio:

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

He pensado en envolver la excepción de entrada en un SignalledException costumbre, y filtrando los de correo, pero luego mis registros se llena de SignalledExceptions, y no las excepciones reales.

¿Alguna otra idea?

¿Fue útil?

Solución

filtrado Elmah trabaja principalmente en tipos de excepción. filtrado programática me permitiría examinar la información añadida a una excepción, pero todavía tengo que venir a través de un tipo de excepción con una propiedad ElmahFilteringData, y yo preferiría no 'invadir' las excepciones que desee registrar. Aquí es cómo he logrado solamente el envío de correo electrónico notificatins para ciertas excepciones señaladas:

En primer lugar tengo una excepción especial envoltura, puramente por decir Elmah no enviar una notificación por correo electrónico para las excepciones de este 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) {}
}

A continuación, cuando levanto una excepción que normalmente solo deseas registra y no enviado por correo electrónico, pero tal vez a veces enviado por correo electrónico, utilizo este código en mi servicio de registro de excepción:

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

Ahora, en los eventos de filtro ELMAH en Global.asax, Desenvuelvo la excepción que entrar, y si se envuelve, descarto de la tubería notificación por correo electrónico:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top