Ich verwende derzeit log4net in meiner ASP.NET MVC-Anwendung, um Ausnahmen zu protokollieren. Ich mache das so, indem ich alle meine Controller von einer BaseController-Klasse erben lasse. Im OnActionExecuting-Ereignis des BaseControllers protokolliere ich alle Ausnahmen, die möglicherweise aufgetreten sind:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
Dies funktioniert hervorragend, wenn während einer Controller-Aktion eine nicht behandelte Ausnahme aufgetreten ist.
Für 404-Fehler habe ich einen benutzerdefinierten Fehler in meiner web.config wie folgt eingerichtet:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Und in der Controller-Aktion, die die URL "Seite nicht gefunden" verarbeitet, protokolliere ich die angeforderte Original-URL:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Und das funktioniert auch.
Das Problem, das ich habe, ist, wie Fehler protokolliert werden, die sich auf den ASPX-Seiten selbst befinden. Angenommen, ich habe einen Kompilierungsfehler auf einer der Seiten oder einen Inline-Code, der eine Ausnahme auslöst:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Es scheint, dass das HandleError-Attribut dies korrekt auf meine Error.aspx-Seite im freigegebenen Ordner umleitet, aber es wird definitiv nicht von der OnActionExecuted-Methode meines BaseControllers abgefangen. Ich dachte, ich könnte den Protokollierungscode vielleicht auf der Error.aspx-Seite selbst platzieren, bin mir aber nicht sicher, wie ich die Fehlerinformationen auf dieser Ebene abrufen soll.
quelle
Antworten:
Ich würde in Betracht ziehen, Ihre Webanwendung durch Einstecken von Elmah zu vereinfachen .
Sie fügen Ihrem Projekt die Elmah-Assembly hinzu und konfigurieren dann Ihre web.config. Anschließend werden Ausnahmen protokolliert, die auf Controller- oder Seitenebene erstellt wurden. Es kann so konfiguriert werden, dass es sich an verschiedenen Orten (wie SQL Server, E-Mail usw.) anmeldet. Es bietet auch ein Web-Frontend, mit dem Sie das Protokoll der Ausnahmen durchsuchen können.
Es ist das erste, was ich zu einer von mir erstellten asp.net mvc-App hinzufüge.
Ich benutze immer noch log4net, aber ich neige dazu, es zum Protokollieren von Debug / Info zu verwenden und überlasse alle Ausnahmen Elmah.
Weitere Informationen finden Sie auch in der Frage Wie protokollieren Sie Fehler (Ausnahmen) in Ihren ASP.NET-Apps? .
quelle
Sie können sich in das OnError-Ereignis in Global.asax einbinden.
Etwas wie das:
quelle
Server
wird immer ungleich Null sein.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3-
Attribut erstellen, das von HandleErrorInfoAttribute erbt und die Protokollierung Ihrer Wahl enthält
Platzieren Sie das Attribut in Global.asax RegisterGlobalFilters
quelle
Haben Sie darüber nachgedacht, das HandleError-Attribut zu erweitern? Auch Scott hat eine gute Blog - Post über Filter Abfangjäger auf Controller / Aktionen hier .
quelle
Die Ansicht Error.aspx ist wie folgt definiert:
Die HandleErrorInfo verfügt über drei Eigenschaften: Zeichenfolge ActionName Zeichenfolge ControllerName Exception Exception
Sie sollten in der Ansicht auf HandleErrorInfo und damit auf die Ausnahme zugreifen können.
quelle
Sie können versuchen, HttpContext.Error zu untersuchen, aber ich bin mir nicht sicher.
quelle