Atualmente, estou usando log4net em meu aplicativo ASP.NET MVC para registrar exceções. Estou fazendo isso fazendo com que todos os meus controladores herdem de uma classe BaseController. No evento OnActionExecuting do BaseController, registro todas as exceções que possam ter ocorrido:
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);
}
}
Isso funciona muito bem se uma exceção não tratada ocorreu durante uma ação do controlador.
Quanto aos erros 404, eu tenho um erro personalizado configurado em meu web.config assim:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
E na ação do controlador que lida com o url "página não encontrada", eu registro o URL original que está sendo solicitado:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
E isso também funciona.
O problema que estou tendo é como registrar os erros que estão nas próprias páginas .aspx. Digamos que eu tenha um erro de compilação em uma das páginas ou algum código embutido que gerará uma exceção:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Parece que o atributo HandleError está redirecionando isso corretamente para minha página Error.aspx na pasta Compartilhada, mas definitivamente não está sendo capturado pelo método OnActionExecuted do meu BaseController. Eu estava pensando que talvez pudesse colocar o código de registro na própria página Error.aspx, mas não tenho certeza de como recuperar as informações de erro nesse nível.