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.