Données d'affichage ELMAH dans le dictionnaire de données d'exception

StackOverflow https://stackoverflow.com/questions/1223282

  •  11-07-2019
  •  | 
  •  

Question

Lorsque vous utilisez ELMAH (ce qui est génial), est-il possible d'afficher des informations supplémentaires que vous avez ajoutées à une exception.

ex.

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

Lorsque je visualise l'exception de elmah.axd, il ne semble pas afficher la clé «ExtraInfo» ni les informations sur la valeur, mais uniquement la chaîne de l'exception.

Était-ce utile?

La solution

Non, il n'est pas possible d'afficher les informations supplémentaires avec les versions 1.x actuelles.

Autres conseils

Ma solution consistait à ajouter les informations à la collection Server Variables comme suit.

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

Oui, je pense que c'est un hack.
Pour de petites quantités de données supplémentaires, envisagez d'encapsuler l'erreur suggérée par @Roma
Cependant, cette méthode est particulièrement utile lorsque vous avez trop d'informations à mettre dans un "message d'erreur encapsulé"

La méthode la plus simple consiste à encapsuler l’erreur. L’erreur externe contiendra votre message personnalisé.

string msg = "my custom error message";

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

D'accord, j'attendais cela depuis trop longtemps maintenant et j'ai décidé d'en créer un autre et de l'inclure moi-même.

Vous pouvez le trouver ici: https://github.com/boena/elmah- avec données personnalisées

Elmah utilise la méthode ToString () pour obtenir les détails sur les exceptions. Remplacez simplement votre méthode d'exception personnalisée ToString () et cela fonctionnera ainsi:

exemple d'exception dans elmah

Ma classe d'exception:

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

Eh bien, après avoir passé la journée à travailler là-dessus, je pensais partager ma solution. Très similaire à la solution de Myster ci-dessus, la différence étant que je modifie l'objet d'erreur utilisé par elmah à la place des variables du serveur de requêtes, comme suit:

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

Ensuite, selon votre application à appeler logger.LogError:

mvc ajoute un filtre d'erreur personnalisé ( http : //maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html )

Les formulaires Web remplacent Application_Error dans le fichier global.asax

.

Ensuite, une dernière étape dans le fichier global.asax, supprimez les erreurs déjà enregistrées:

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

Puisqu'il est open source, vous pouvez simplement saisir le projet et personnaliser Elmah à vos propres fins:

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

Si vous utilisez MSSQL

  • jetez un oeil à SqlErrorLog.cs

  • SQLServer.sql pour générer votre propre base de données

Je fais la même chose, mais je dois ajouter un " code d'erreur " généré aléatoirement colonne et je vais utiliser des données d'exception pour suivre toutes les informations personnalisées, de session, de formulaire et de cookie qui se trouveraient normalement dans le champ xber ultra large Je peux changer cela en JSON, pas encore sûr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top