В настоящее время я использую log4net в своем приложении ASP.NET MVC для регистрации исключений. Я делаю это, когда все мои контроллеры наследуются от класса BaseController. В событии OnActionExecuting BaseController я регистрирую любые исключения, которые могли произойти:
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);
}
}
Это прекрасно работает, если во время действия контроллера произошло необработанное исключение.
Что касается 404 ошибок, в моем файле web.config настроена ошибка, например:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
И в действии контроллера, которое обрабатывает URL «страница не найдена», я записываю исходный запрашиваемый URL:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
И это тоже работает.
Проблема, с которой я сталкиваюсь, заключается в том, как регистрировать ошибки, которые находятся на самих страницах .aspx. Допустим, у меня есть ошибка компиляции на одной из страниц или некоторый встроенный код, который выдает исключение:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Кажется, что атрибут HandleError правильно перенаправляет это на мою страницу Error.aspx в папке Shared, но он определенно не перехватывается методом OnActionExecuted моего BaseController. Я думал, что, возможно, смогу разместить код регистрации на самой странице Error.aspx, но я не уверен, как получить информацию об ошибке на этом уровне.