Le filtrage Elmah fonctionne principalement sur les types d'exception. Le filtrage programmatique me permettrait d'examiner les informations ajoutées à une exception, mais je n'ai pas encore trouvé de type Exception avec une propriété ElmahFilteringData
, et je préfère ne pas "envahir" les exceptions que je veux enregistrer. Voici comment j'accompli que l'envoi d'email notificatins pour certaines signalisés exceptions:
Tout d'abord j'ai une exception emballage spéciale, uniquement pour dire Elmah de ne pas envoyer une notification par e-mail pour les exceptions de ce type:
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) {}
}
Ensuite, , quand je lève une exception normalement, je ne veux connecté et non envoyé par courrier électronique, mais peut-être parfois envoyé par courriel, j'utiliser ce code dans mon service de journalisation d'exception:
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);
}
}
maintenant, dans les événements de filtre Elmah dans Global.asax, je déballer l'exception sur le journal, et s'il est enveloppé, le rejeter à partir du pipeline de notification par courrier électronique:
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();
}
}