J'utilise actuellement log4net dans mon application ASP.NET MVC pour enregistrer les exceptions. La façon dont je fais cela est de faire hériter tous mes contrôleurs d'une classe BaseController. Dans l'événement OnActionExecuting de BaseController, je consigne toutes les exceptions qui ont pu se produire:
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);
}
}
Cela fonctionne très bien si une exception non gérée s'est produite lors d'une action du contrôleur.
En ce qui concerne les erreurs 404, j'ai une erreur personnalisée configurée dans mon web.config comme suit:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Et dans l'action du contrôleur qui gère l'url "page non trouvée", je consigne l'url d'origine demandée:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Et cela fonctionne aussi.
Le problème que j'ai est de savoir comment enregistrer les erreurs qui se trouvent sur les pages .aspx elles-mêmes. Disons que j'ai une erreur de compilation sur l'une des pages ou un code en ligne qui lèvera une exception:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Il semble que l'attribut HandleError redirige correctement cela vers ma page Error.aspx dans le dossier Shared, mais il n'est certainement pas intercepté par la méthode OnActionExecuted de mon BaseController. Je pensais que je pourrais peut-être mettre le code de journalisation sur la page Error.aspx elle-même, mais je ne suis pas sûr de savoir comment récupérer les informations d'erreur à ce niveau.
la source
Réponses:
J'envisagerais de simplifier votre application Web en branchant Elmah .
Vous ajoutez l'assembly Elmah à votre projet, puis configurez votre web.config. Il enregistrera ensuite les exceptions créées au niveau du contrôleur ou de la page. Il peut être configuré pour se connecter à différents endroits (comme SQL Server, Email, etc.). Il fournit également une interface Web, afin que vous puissiez parcourir le journal des exceptions.
C'est la première chose que j'ajoute à toute application mvc asp.net que je crée.
J'utilise toujours log4net, mais j'ai tendance à l'utiliser pour journaliser le débogage / info, et laisser toutes les exceptions à Elmah.
Vous pouvez également trouver plus d'informations dans la question Comment consignez-vous les erreurs (exceptions) dans vos applications ASP.NET? .
la source
Vous pouvez vous connecter à l'événement OnError dans Global.asax.
Quelque chose comme ça:
la source
Server
sera toujours non nul.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3
Create Attribute qui hérite de HandleErrorInfoAttribute et inclut votre choix de journalisation
Placer l'attribut dans Global.asax RegisterGlobalFilters
la source
Avez-vous pensé à étendre l'attribut HandleError? En outre, Scott a un bon article de blog sur les intercepteurs de filtre sur les contrôleurs / actions ici .
la source
La vue Error.aspx est définie comme ceci:
Le HandleErrorInfo a trois propriétés: string ActionName string ControllerName Exception Exception
Vous devriez pouvoir accéder à HandleErrorInfo et donc à l'exception dans la vue.
la source
Vous pouvez essayer d'examiner HttpContext.Error, mais je n'en suis pas sûr.
la source