Ich versuche, ELMAH zum Protokollieren von Fehlern in meiner ASP.NET MVC-Anwendung zu verwenden. Wenn ich jedoch das Attribut [HandleError] auf meinen Controllern verwende, protokolliert ELMAH keine Fehler, wenn sie auftreten.
Wie ich vermute, liegt es daran, dass ELMAH nur nicht behandelte Fehler protokolliert und das Attribut [HandleError] den Fehler behandelt, sodass es nicht protokolliert werden muss.
Wie ändere ich oder wie würde ich das Attribut ändern, damit ELMAH erkennt, dass ein Fehler aufgetreten ist, und ihn protokolliere.
Bearbeiten: Lassen Sie mich sicherstellen, dass jeder versteht, ich weiß, dass ich das Attribut ändern kann, das nicht die Frage ist, die ich stelle ... ELMAH wird umgangen, wenn das handleerror-Attribut verwendet wird, was bedeutet, dass es keinen Fehler gibt, weil es behandelt wurde bereits nach dem Attribut ... Was ich frage, ist eine Möglichkeit, ELMAH dazu zu bringen, den Fehler zu sehen und zu protokollieren, obwohl das Attribut ihn behandelt hat ... Ich habe mich umgesehen und sehe keine Methoden zum Aufrufen, um ihn zum Protokollieren zu zwingen der Fehler....
quelle
Antworten:
Sie können
HandleErrorAttribute
dasOnException
Mitglied unterklassifizieren und überschreiben (kein Kopieren erforderlich), sodass es die Ausnahme mit ELMAH protokolliert und nur dann, wenn die Basisimplementierung dies behandelt. Die minimale Menge an Code, die Sie benötigen, ist wie folgt:Die Basisimplementierung wird zuerst aufgerufen, sodass die Ausnahme als behandelt markiert werden kann. Erst dann wird die Ausnahme signalisiert. Der obige Code ist einfach und kann Probleme verursachen, wenn er in einer Umgebung verwendet wird, in der er
HttpContext
möglicherweise nicht verfügbar ist, z. B. beim Testen. Infolgedessen möchten Sie Code, der defensiver ist (auf Kosten einer etwas längeren Länge):Diese zweite Version wird versuchen, zuerst die Fehlersignalisierung von ELMAH zu verwenden, die die vollständig konfigurierte Pipeline wie Protokollierung, Mailing, Filterung und was Sie haben umfasst. Andernfalls wird versucht zu prüfen, ob der Fehler gefiltert werden soll. Wenn nicht, wird der Fehler einfach protokolliert. Diese Implementierung verarbeitet keine E-Mail-Benachrichtigungen. Wenn die Ausnahme signalisiert werden kann, wird eine E-Mail gesendet, sofern dies konfiguriert ist.
Möglicherweise müssen Sie auch darauf achten, dass bei mehreren
HandleErrorAttribute
Instanzen keine doppelte Protokollierung erfolgt. Die beiden oben genannten Beispiele sollten jedoch den Anfang machen.quelle
Entschuldigung, aber ich denke, die akzeptierte Antwort ist ein Overkill. Alles was Sie tun müssen ist Folgendes:
und registrieren Sie es dann (Reihenfolge ist wichtig) in Global.asax.cs:
quelle
HandleErrorAttribute
, keine Notwendigkeit , außer Kraft setztOnException
aufBaseController
. Dies setzt die akzeptierte Antwort voraus.new UnhandledLoggedException(Exception thrown)
einschließen , um Dinge an die Ausnahmemeldung usw. anzuhängen (z. B. die etwas an die anhängt,Message
bevor sie zurückgegeben wird.ElmahHandledErrorLoggerFilter()
elmah protokolliert nur nicht behandelte Fehler, wird aber nicht behandelt. Ich habe Filter in der richtigen Reihenfolge registriert, als Sie das erwähnt haben. Irgendwelche Gedanken?In NuGet gibt es jetzt ein ELMAH.MVC-Paket, das eine verbesserte Lösung von Atif sowie einen Controller enthält, der die elmah-Schnittstelle innerhalb des MVC-Routings verwaltet (diese Axd muss nicht mehr verwendet werden).
Das Problem mit dieser Lösung (und mit allen hier) ) ist, dass der elmah-Fehlerbehandler den Fehler auf die eine oder andere Weise tatsächlich behandelt und ignoriert, was Sie möglicherweise als customError-Tag oder über ErrorHandler oder Ihren eigenen Fehlerbehandler einrichten möchten
Die beste Lösung ist meiner Meinung nach, einen Filter zu erstellen, der am Ende aller anderen Filter wirkt und die bereits behandelten Ereignisse protokolliert. Das elmah-Modul sollte sich darum kümmern, die anderen Fehler zu protokollieren, die von der Anwendung nicht behandelt werden. Auf diese Weise können Sie auch den Integritätsmonitor und alle anderen Module verwenden, die asp.net hinzugefügt werden können, um Fehlerereignisse anzuzeigen
Ich habe diesen Blick mit Reflektor auf den ErrorHandler in elmah.mvc geschrieben
In Ihrer Filterkonfiguration möchten Sie nun Folgendes tun:
Beachten Sie, dass ich dort einen Kommentar hinterlassen habe, um die Leute daran zu erinnern, dass, wenn sie einen globalen Filter hinzufügen möchten, der die Ausnahme tatsächlich behandelt, dieser VOR diesem letzten Filter angezeigt wird. Andernfalls tritt der Fall auf, in dem die nicht behandelte Ausnahme vom ElmahMVCErrorFilter ignoriert wird, weil Es wurde nicht behandelt und sollte vom Elmah-Modul protokolliert werden. Der nächste Filter markiert die Ausnahme jedoch als behandelt und das Modul ignoriert sie. Dies führt dazu, dass die Ausnahme niemals zu elmah wird.
Stellen Sie nun sicher, dass die Apps für elmah in Ihrer Webkonfiguration ungefähr so aussehen:
Das wichtigste hier ist "elmah.mvc.disableHandleErrorFilter". Wenn dies falsch ist, wird der Handler in elmah.mvc verwendet, der die Ausnahme tatsächlich behandelt, indem der Standard-HandleErrorHandler verwendet wird, der Ihre customError-Einstellungen ignoriert
Mit diesem Setup können Sie Ihre eigenen ErrorHandler-Tags in Klassen und Ansichten festlegen, während Sie diese Fehler weiterhin über den ElmahMVCErrorFilter protokollieren, Ihrer web.config über das elmah-Modul eine customError-Konfiguration hinzufügen und sogar Ihre eigenen Fehlerbehandler schreiben. Das einzige, was Sie tun müssen, ist daran zu denken, keine Filter hinzuzufügen, die den Fehler tatsächlich behandeln, bevor der von uns geschriebene elmah-Filter verwendet wird. Und ich habe vergessen zu erwähnen: keine Duplikate in Elma.
quelle
Sie können den obigen Code verwenden und einen Schritt weiter gehen, indem Sie eine benutzerdefinierte Controller-Factory einführen, die das HandleErrorWithElmah-Attribut in jeden Controller einfügt.
Weitere Informationen finden Sie in meiner Blogserie zum Anmelden bei MVC. Der erste Artikel behandelt die Einrichtung und den Betrieb von Elmah für MVC.
Am Ende des Artikels befindet sich ein Link zum herunterladbaren Code. Ich hoffe, das hilft.
http://dotnetdarren.wordpress.com/
quelle
Ich bin neu in ASP.NET MVC. Ich hatte das gleiche Problem: Folgendes kann ich in meiner Datei Erorr.vbhtml bearbeiten (es funktioniert, wenn Sie den Fehler nur mit dem Elmah-Protokoll protokollieren müssen).
Es ist einfach!
quelle
Eine völlig alternative Lösung besteht darin, die MVC nicht zu verwenden
HandleErrorAttribute
und sich stattdessen auf die ASP.Net-Fehlerbehandlung zu verlassen, mit der Elmah arbeiten soll.Sie müssen den globalen Standard
HandleErrorAttribute
aus App_Start \ FilterConfig (oder Global.asax) entfernen und dann eine Fehlerseite in Ihrer Web.config einrichten:Beachten Sie, dass dies eine MVC-geroutete URL sein kann, sodass die oben genannten Informationen zur
ErrorController.Index
Aktion umleiten, wenn ein Fehler auftritt.quelle
Für mich war es sehr wichtig, dass die E-Mail-Protokollierung funktioniert. Nach einiger Zeit stelle ich fest, dass dies im Atif-Beispiel nur 2 Codezeilen mehr benötigt.
Ich hoffe das hilft jemandem :)
quelle
Genau das brauchte ich für meine MVC-Site-Konfiguration!
Ich habe der
OnException
Methode eine kleine Änderung hinzugefügt , um mehrereHandleErrorAttribute
Instanzen zu verarbeiten , wie von Atif Aziz vorgeschlagen:Ich überprüfe einfach,
context.ExceptionHandled
bevor ich die Basisklasse aufrufe, um zu wissen, ob jemand anderes die Ausnahme vor dem aktuellen Handler behandelt hat.Es funktioniert für mich und ich poste den Code, falls jemand anderes ihn benötigt, und frage, ob jemand weiß, ob ich etwas übersehen habe.
Hoffe es ist nützlich:
quelle