Attualmente sto utilizzando log4net nella mia applicazione ASP.NET MVC per registrare le eccezioni. Il modo in cui lo faccio è che tutti i miei controller ereditano da una classe BaseController. Nell'evento OnActionExecuting di BaseController, registro tutte le eccezioni che potrebbero essersi verificate:
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);
}
}
Funziona alla grande se si verifica un'eccezione non gestita durante un'azione del controller.
Per quanto riguarda gli errori 404, ho un errore personalizzato impostato nel mio web.config in questo modo:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
E nell'azione del controller che gestisce l'URL "pagina non trovata", registro l'URL originale richiesto:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
E funziona anche questo.
Il problema che sto riscontrando è come registrare gli errori che si trovano nelle pagine .aspx stesse. Diciamo che ho un errore di compilazione su una delle pagine o un codice inline che genererà un'eccezione:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Sembra che l'attributo HandleError lo stia reindirizzando correttamente alla mia pagina Error.aspx nella cartella condivisa, ma sicuramente non viene rilevato dal metodo OnActionExecuted del mio BaseController. Stavo pensando di poter inserire il codice di registrazione nella pagina Error.aspx stessa, ma non sono sicuro di come recuperare le informazioni sull'errore a quel livello.