2008-08-15 9 views
25

Ich suche nach dem besten Weg, um Fehler in einer ASP.NET-Anwendung zu protokollieren. Ich möchte in der Lage sein, E-Mails zu erhalten, wenn Fehler in meiner Anwendung auftreten, mit detaillierten Informationen über die Ausnahme und die aktuelle Anfrage.Wie protokollieren Sie Fehler (Ausnahmen) in Ihren ASP.NET-Anwendungen?

In meiner Firma hatten wir früher einen eigenen ErrorMailer, der alles im Global.asax Application_Error abfing. Es war "Ok" aber nicht sehr flexibel noch konfigurierbar.

Wir haben vor kurzem auf NLog gewechselt. Es ist viel konfigurierbarer, wir können verschiedene Ziele für die Fehler definieren, filtern, puffern (noch nicht ausprobiert). Es ist eine sehr gute Verbesserung.

Aber ich habe in letzter Zeit entdeckt, dass es einen ganzen Namespace im .Net-Framework für diesen Zweck gibt: System.Web.Management und es kann im healthMonitoring Abschnitt von web.config konfiguriert werden.

Haben Sie schon einmal mit .Net Health Monitoring gearbeitet? Was ist Ihre Lösung für die Fehlerprotokollierung?

+0

Ich habe auch System.Web.Management gesehen, aber ich habe es nie benutzt. Ich würde gerne ein Feedback darüber hören, ob es gut funktioniert. –

Antwort

27

Ich verwende elmah. Es hat einige wirklich nette Eigenschaften und hier ist ein Artikel darüber. Ich denke, dass das StackOverflow-Team auch Elmah benutzt!

+4

Ich schrieb letztes Jahr ein [ELMAH Tutorial] (http://blog.elmah.io/elmah-tutorial/), das dieses Szenario meines Erachtens detaillierter beschreibt als der CodeProject-Artikel. – ThomasArdal

0

Wir verwenden eine benutzerdefinierte selbst erstellte Protokollierung util wir geschrieben haben. Sie müssen die Protokollierung selbst implementieren, wo immer Sie sie benötigen. Es erlaubt Ihnen jedoch, viel mehr als nur die Ausnahme zu erfassen.

Zum Beispiel unseres Code würde wie folgt aussehen:

Try 
    Dim p as New Person() 
    p.Name = "Joe" 
    p.Age = 30 
Catch ex as Exception 
    Log.LogException(ex,"Err creating person and assigning name/age") 
    Throw ex 
End Try 

Auf diese Weise unserer Logger alle Informationen schreiben wir zu einer SQL-Datenbank benötigen. Wir haben E-Mail-Benachrichtigungen eingerichtet, um auf der Ebene der Datenbank nach bestimmten Fehlern oder häufig auftretenden Fehlern zu suchen. Es hilft uns, genau festzustellen, woher die Fehler kommen.

Dies ist möglicherweise nicht genau das, wonach Sie suchen. Ein anderer Ansatz, der der Verwendung von Global.asax ähnlich ist, ist eine Code-Injektionstechnik wie AOP mit PostSharp. Auf diese Weise können Sie benutzerdefinierten Code am Anfang und am Ende jeder Methode oder für jede Ausnahme einfügen. Es ist eine interessante Herangehensweise, aber ich glaube, dass es einen hohen Leistungsaufwand haben kann.

0

Mein Team verwendet log4net von Apache. Es ist ziemlich leicht und einfach einzurichten. Das Beste daran ist, dass es vollständig aus der web.config-Datei konfiguriert werden kann. Sobald Sie also die Hooks in Ihrem Code-Setup haben, können Sie die Art der Protokollierung ändern, indem Sie einfach die Datei web.config ändern.

log4net unterstützt die Protokollierung an einer Vielzahl von Standorten - Datenbank, E-Mail, Textdatei, Windows-Ereignisprotokoll usw. Mein Team ist so konfiguriert, dass detaillierte Fehlerinformationen an eine Datenbank gesendet und eine E-Mail an das gesamte Team gesendet wird mit genügend Informationen für uns zu bestimmen, in welchem ​​Teil des Codes der Fehler entstanden ist. Dann wissen wir, wer für diesen Code verantwortlich ist, und sie können zur Datenbank gehen, um detailliertere Informationen zu erhalten.

2

Ich habe die Logging-Objekte der Enterprise Library verwendet. Es ermöglicht Ihnen verschiedene Arten der Protokollierung (Flat File, E-Mail und/oder Datenbank). Es ist ziemlich anpassbar und hat eine ziemlich gute Schnittstelle für die Aktualisierung Ihrer web.config für die Konfiguration der Protokollierung. Normalerweise rufe ich meine Protokollierung vom On Error im Global.asax auf.

Here's a link to the MSDN

+0

Ich musste vor einem Jahr die MS Enterprise Library Logging für ein Projekt verwenden. Es war sehr verworren und ich kann mich nicht an die genauen Details erinnern, aber es fehlte eine minimale Funktionalität, die man bei einer Protokollierungslösung erwarten würde. Es gibt ein Add-In für Visual Studio, das die einzige Möglichkeit bietet, web.config richtig einzurichten. Dieses Tool formatiert Ihre web.config neu und löscht alle Kommentare daraus :( – TechSavvySam

9

Ich habe Log4net benutze, konfiguriert Details von fatalen Fehlern E-Mail. Es ist auch eingerichtet, alles in eine Protokolldatei zu schreiben, was beim Debuggen von Problemen von unschätzbarem Wert ist. Der andere Vorteil besteht darin, dass es, wenn diese Standardfunktionalität nicht Ihren Vorstellungen entspricht, einfach ist, einen benutzerdefinierten Appender zu schreiben, der die Protokollierungsinformationen nach Bedarf verarbeiten kann.

Ich benutze dies zusammen mit einem benutzerdefinierten Error-Handler, der eine HTML-E-Mail mit ein wenig mehr Informationen als in der Standard-log4net E-Mails - Seite, Sitzungsvariablen, Cookies, HTTP-Server-Variablen sendet usw.

Diese werden beide im Ereignis Application_OnError verdrahtet, wobei die Ausnahme als schwerwiegende Ausnahme in log4net protokolliert wird (wodurch sie an eine angegebene E-Mail-Adresse gesendet wird) und auch mit dem benutzerdefinierten Fehler behandelt wird Handler.

Zum ersten Mal von Elmah aus dem Coding Horror Blog-Eintrag, Crash Responsibly gehört, und obwohl es vielversprechend aussieht, bin ich es noch keine Projekte umzusetzen.

+0

+1 Ich hätte es nicht besser sagen können! –

0

Ich habe vor kurzem einen ASP.net-Webservice mit NLog erstellt, den ich für alle meine Desktop-Apps verwende. Die Protokollierung funktioniert einwandfrei, wenn ich in Visual Studio debuggen, aber sobald ich zu IIS umschalte, wird die Protokolldatei nicht erstellt; Ich habe noch nicht bestimmt, warum, aber es ist die Tatsache, dass ich nach einer Lösung suchen muss, möchte ich etwas anderes für meine asp.net Bedürfnisse ausprobieren wollen!

2

Ich benutze log4net und wo immer ich erwarte eine Ausnahme ich log es auf die entsprechende Ebene. Ich tendiere dazu, die Ausnahme nicht erneut zu werfen, weil es nicht wirklich für eine so angenehme Benutzererfahrung sorgt, dass es weniger Informationen gibt, die Sie im aktuellen Status bereitstellen können.

Ich habe Application_Error auch konfiguriert, um jede Ausnahme abzufangen, die nicht erwartet wurde, und der Fehler wird als eine schwerwiegende Priorität durch log4net protokolliert (gut, 404 werden als Info erkannt und protokolliert, da sie nicht so schwer sind).

0

Wir verwenden EnterpriseLibrary.ExceptionHandling.Logging. Ich mag es ein wenig besser als log4net, weil wir nicht nur die Protokollierung vollständig kontrollieren, sondern auch die Throw/NoThrow-Entscheidung innerhalb der Konfiguration steuern können.