Filtrado excepciones señaladas de correos electrónicos de error ELMAH
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?
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();
}
}