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.
fuente
Respuestas:
Consideraría simplificar su aplicación web conectando Elmah .
Agrega el ensamblado Elmah a su proyecto y luego configura su web.config. Luego, registrará las excepciones creadas a nivel de controlador o página. Se puede configurar para iniciar sesión en varios lugares diferentes (como SQL Server, correo electrónico, etc.). También proporciona una interfaz web, para que pueda navegar por el registro de excepciones.
Es lo primero que agrego a cualquier aplicación asp.net mvc que cree.
Todavía uso log4net, pero tiendo a usarlo para registrar información / depuración, y dejo todas las excepciones a Elmah.
También puede encontrar más información en la pregunta ¿Cómo registra errores (excepciones) en sus aplicaciones ASP.NET? .
fuente
Puede conectarse al evento OnError en Global.asax.
Algo como esto:
fuente
Server
siempre será no nulo.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3
Create Attribute que hereda de HandleErrorInfoAttribute e incluye su elección de registro
Coloque el atributo en Global.asax RegisterGlobalFilters
fuente
¿Ha pensado en ampliar el atributo HandleError? Además, Scott tiene una buena publicación de blog sobre interceptores de filtros en controladores / acciones aquí .
fuente
La vista Error.aspx se define así:
HandleErrorInfo tiene tres propiedades: string ActionName string ControllerName Exception Exception
Debería poder acceder a HandleErrorInfo y, por lo tanto, a la excepción dentro de la vista.
fuente
Puede intentar examinar HttpContext.Error, pero no estoy seguro de esto.
fuente