Domanda

Ho implementato un metodo wrapper di Elmah errore di segnalazione, in cui un'eccezione sollevata è visto solo dal Elmah per la registrazione e mailing, ma ora mi piacerebbe filtrare solo queste eccezioni segnalate fuori della mailing, ma ancora li login . Come posso fare questo?

Questa è la mia semplice involucro:

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

Ho pensato di avvolgere l'eccezione di ingresso in un SignalledException personalizzato, e filtrando quelli fuori di mailing, ma poi i miei registri di ottenere pieno di SignalledExceptions, e non le vere eccezioni.

Tutte le altre idee per favore?

È stato utile?

Soluzione

filtraggio Elmah lavora principalmente su tipi di eccezione. filtraggio programmatico mi avrebbe permesso di esaminare le informazioni aggiunte un'eccezione, ma non ho ancora incontrato un tipo di eccezione con una proprietà ElmahFilteringData, e preferisco non 'invadere' le eccezioni che voglio registrato. Ecco come ho compiuto l'invio di e-mail solo notificatins alcune eccezioni segnalate:

Per prima cosa ho un'eccezione speciale involucro, puramente per raccontare Elmah di non inviare una notifica via email per le eccezioni di questo 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) {}
}

Poi, quando alzo un'eccezione Io di solito vogliono solo registrato e non via email, ma forse a volte inviato via email, ho utilizzare questo codice nel mio servizio di registrazione di eccezione:

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

Ora, negli eventi di filtro ELMAH in Global.asax, ho scartare l'eccezione per registrare, e se è avvolto, respingerlo dalla tubazione di notifica e-mail:

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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top