ELMAH Anzeigedaten in Ausnahmedaten Wörterbuch
-
11-07-2019 - |
Frage
Bei der Verwendung von ELMAH (die brillant ist) ist es möglich, zusätzliche Informationen anzuzeigen, die Sie eine Ausnahme hinzugefügt haben.
z.
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);
Wenn ich sehe, die Ausnahme von elmah.axd es scheint nicht zu den „Extrainfo“ Schlüssel und Wertinformationen zu zeigen, nur die Ausnahme String.
Lösung
Nein, es ist nicht möglich, die zusätzliche Informationen mit den aktuellen 1.x Versionen anzuzeigen.
Andere Tipps
war meine Lösung der Informationen an die Server-Variablen Sammlung hinzuzufügen, wie so.
var context = HttpContext.Current;
context.Request.ServerVariables["ERROR_CALLING_WEBSERVICE_URI"] = uri;
Elmah.ErrorLog.GetDefault(context).Log(new Error(e, context))
Ja, ich denke, das ist ein Hack.
Für kleine Mengen von zusätzlichen Daten betrachten Einkapseln der Fehler, wie durch @Roma
vorgeschlagen
Jedoch ist diese Methode besonders nützlich ist, wenn Sie zu viel Information setzen in eine ‚gekapselte Fehlermeldung‘
Der einfache Weg, um zu gehen, ist es, den Fehler zu verkapseln. Der äußere Fehler Sie benutzerdefinierte Nachricht enthalten.
string msg = "my custom error message";
ErrorSignal.FromCurrentContext().Raise(
new Elmah.ApplicationException(msg,ex));
Ok, so habe ich darauf gewartet, diese jetzt zu lang aufgenommen werden und beschlossen, eine eigene Gabel daraus zu machen und auch die Funktion selbst.
Sie können es hier finden: https://github.com/boena/elmah- mit-custom-Daten
Elmah verwendet ToString () -Methode Ausnahme Details zu erhalten. außer Kraft setzen Sie einfach Ihre benutzerdefinierte Ausnahme ToString () Methode und auf diese Weise wird es funktionieren:
Meine Ausnahmeklasse:
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
);
}
}
Nun, den Tag verbracht hat daran gearbeitet, ich dachte, dass ich meine Lösung teilen würde. Sehr ähnlich oben Myster-Lösung, wobei der Unterschied darin ich das Fehlerobjekt durch Elmah anstelle der Anforderungsserver verwendeten Variablen ändern, etwa so:
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);
}
Dann je nach Anwendung logger.LogError zu nennen:
mvc einen benutzerdefinierten Fehler Filter hinzufügen ( http : //maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html )
webforms außer Kraft setzen Application_Error in global.asax
Dann nur noch eine letzte Schritt in der global.asax, entlassen alle Fehler, die bereits protokolliert wurden:
public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception.Data.Contains("Logged"))
{
if (e.Exception.Data["Logged"].Equals(true)) e.Dismiss();
}
}
Da es Open Source ist, könnten Sie einfach das Projekt packen und Elmah für Ihre eigenen Zwecke anpassen:
http://code.google.com/p/elmah/
Wenn Sie mit MSSQL
-
einen Blick auf SqlErrorLog.cs nehmen
-
SQLServer.sql Ihre eigene Datenbank generieren
Ich mache die gleichen, aber ich brauche eine zusätzliche zufällig generierten „Fehlercode“ Spalt hinzufügen und ich werde Ausnahmedaten werden mit alle, der Gewohnheit zu verfolgen, Sitzung, Form, Cookie-Informationen, die normalerweise in der sein würden, Über große xML-Feld. Ich kann dies zu JSON ändern, noch nicht sicher.