Frage

Ich habe eine Wrapper-Methode um Elmah der Fehlersignalisierung implementiert, wobei eine erhöhte Ausnahme nur durch Elmah für die Protokollierung und Mailing zu sehen ist, aber jetzt mag ich Filter mag nur diese signalisierte Ausnahmen aus dem Mailing, aber sie immer noch einloggen . Wie kann ich das tun?

Dies ist mein einfacher Wrapper:

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

Ich habe gedacht, die Eingang Ausnahme in einem benutzerdefinierten SignalledException Einwickeln und Filterung diejenigen aus Mailing, aber dann meinen Protokollen erhalten voller SignalledExceptions, und nicht die wirklichen Ausnahmen.

Jede andere Ideen bitte?

War es hilfreich?

Lösung

Elmah Filterung arbeitet hauptsächlich auf Ausnahmetypen. Programmatische Filterung würde mir erlauben, Informationen zu prüfen, um eine Ausnahme hinzugefügt, aber ich habe noch über einen Ausnahmetyp mit einem ElmahFilteringData Eigentum zu kommen, und ich es vorziehen, nicht zu ‚überfallen‘, um die Ausnahmen ich angemeldet werden soll. Hier ist, wie ich nur E-Mail-notificatins für bestimmte signalisierte Ausnahmen Senden erreicht:

Zuerst habe ich eine besondere Wrapper Ausnahme, lediglich für das Erklären Elmah keine E-Mail-Benachrichtigung für Ausnahmen von dieser Art an:

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

Dann, wenn ich eine Ausnahme erhöhe ich normalerweise nur protokolliert werden soll und nicht per E-Mail, aber vielleicht manchmal per E-Mail, verwende ich diesen Code in meinem Ausnahme Protokollierungsdienst:

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

Nun, in den Elmah Filterereignissen in Global.asax, ich auspacken die Ausnahme es zu protokollieren, und wenn es gewickelt wird, die Klage aus der E-Mail-Benachrichtigung Pipeline:

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();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top