J'utilise actuellement log4net dans mon application ASP.NET MVC pour enregistrer les exceptions. Pour ce faire, je fais en sorte que tous mes contrôleurs héritent 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 se produit pendant une action du contrôleur.
En ce qui concerne les erreurs 404, j'ai configuré une erreur personnalisé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-not-found", j'enregistre l'url originale 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 je rencontre 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ève une exception :
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Il semble que l'attribut HandleError redirige correctement le message vers ma page Error.aspx dans le dossier partagé, mais il n'est absolument pas pris en compte par la méthode OnActionExecuted de mon BaseController. Je pensais que je pourrais peut-être placer le code de journalisation sur la page Error.aspx elle-même, mais je ne sais pas comment récupérer les informations sur les erreurs à ce niveau.