Actualmente estoy usando log4net en mi aplicación ASP.NET MVC para registrar excepciones. La forma en que estoy haciendo esto es haciendo que todos mis controladores hereden de una clase BaseController. En el evento OnActionExecuting de BaseController, registro cualquier excepción que pueda haber ocurrido:
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);
}
}
Esto funciona muy bien si se produjo una excepción no controlada durante una acción del controlador.
En cuanto a los errores 404, tengo un error personalizado configurado en mi web.config así:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Y en la acción del controlador que maneja la URL "página no encontrada", registro la URL original que se solicita:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Y esto también funciona.
El problema que tengo es cómo registrar los errores que se encuentran en las páginas .aspx. Digamos que tengo un error de compilación en una de las páginas o algún código en línea que generará una excepción:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Parece que el atributo HandleError está redireccionando correctamente esto a mi página Error.aspx en la carpeta compartida, pero definitivamente no está siendo detectado por el método OnActionExecuted de mi BaseController. Estaba pensando que tal vez podría poner el código de registro en la página Error.aspx, pero no estoy seguro de cómo recuperar la información de error en ese nivel.