Domanda

Quando si utilizza ELMAH (che è geniale) è possibile visualizzare ulteriori informazioni aggiunte a un'eccezione.

per es.

Exception ex = new Exception("New exception to use ErrorSignal functionality");
ex.Data.Add("ExtraInfo", "Here is some extra information i would like to be displayed.");
ErrorSignal.FromCurrentContext().Raise(ex);    

Quando visualizzo l'eccezione da elmah.axd non sembra mostrare la chiave "ExtraInfo" e le informazioni sul valore, solo la stringa dell'eccezione.

È stato utile?

Soluzione

No, non è possibile visualizzare le informazioni aggiuntive con le versioni 1.x correnti.

Altri suggerimenti

La mia soluzione era quella di aggiungere le informazioni alla raccolta Variabili del server in questo modo.

var context = HttpContext.Current;
context.Request.ServerVariables["ERROR_CALLING_WEBSERVICE_URI"] = uri;
Elmah.ErrorLog.GetDefault(context).Log(new Error(e, context))

Sì, penso che sia un hack.
Per piccole quantità di dati aggiuntivi considerare l'incapsulamento dell'errore come suggerito da @Roma
Tuttavia, questo metodo è particolarmente utile quando si hanno troppe informazioni da inserire in un "messaggio di errore incapsulato"

Il modo semplice per aggirare è incapsulare l'errore. L'errore esterno conterrà il tuo messaggio personalizzato.

string msg = "my custom error message";

ErrorSignal.FromCurrentContext().Raise(
               new Elmah.ApplicationException(msg,ex));

Ok, quindi sto aspettando che questo sia incluso da troppo tempo ormai e ho deciso di crearne uno e includerne la funzionalità.

Puoi trovarlo qui: https://github.com/boena/elmah- con-custom-dati

Elmah utilizza il metodo ToString () per ottenere dettagli sulle eccezioni. Basta sostituire il metodo ToString () dell'eccezione personalizzata e in questo modo funzionerà:

eccezione di esempio in elmah

La mia classe di eccezione:

public class MyCustomException : Exception
{
    public string CustomProperty { get; set; }

    public MyCustomException(string message, string customProperty): base(message)
    {
        this.CustomProperty = customProperty;
    }

    public override string ToString()
    {
        var result = base.ToString();
        var propertyData = String.Format("CustomProperty: {0}", this.CustomProperty);

        return result.Insert(
            result.IndexOf(Environment.NewLine),
            Environment.NewLine + propertyData
            );
    }
}

Bene, dopo aver trascorso la giornata a lavorare su questo, ho pensato di condividere la mia soluzione. Molto simile alla soluzione di Myster sopra, con la differenza che modifico l'oggetto errore utilizzato da elmah invece delle variabili del server di richiesta, in questo modo:

    public static void LogError(Exception e, IDictionary<string, string> customFields = null)
    {
        var logger = ErrorLog.GetDefault(HttpContext.Current);

        customFields = customFields ?? new Dictionary<string, string>();

        // Used to tell elmah not to log this twice (See global.asax)
        e.Data.Add("Logged", true);

        var error = new Error(e, HttpContext.Current);

        customFields.ForEach(pair => error.ServerVariables.Add(pair.Key, pair.Value));

        logger.Log(error);
    }

Quindi, a seconda dell'applicazione da chiamare logger.LogError:

mvc aggiungi un filtro errori personalizzato ( http : //maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html )

i moduli web hanno la precedenza su Application_Error in global.asax

Quindi, solo un ultimo passaggio di global.asax, elimina tutti gli errori che sono già stati registrati:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (e.Exception.Data.Contains("Logged"))
    {
        if (e.Exception.Data["Logged"].Equals(true)) e.Dismiss();
    }
}

Dato che è open source, potresti semplicemente prendere il progetto e personalizzare Elmah per i tuoi scopi:

http://code.google.com/p/elmah/

Se si utilizza MSSQL

  • dai un'occhiata a SqlErrorLog.cs

  • SQLServer.sql per generare il tuo database

Sto facendo lo stesso, ma devo aggiungere un altro codice di errore generato in modo casuale "quot" colonna e userò i dati delle eccezioni per tenere traccia di tutte le informazioni personalizzate relative a sessione, modulo, cookie che si troverebbero normalmente nel campo xml di grandi dimensioni. Potrei cambiarlo in JSON, non sono ancora sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top