В настоящее время я использую 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 в общей папке, но он определенно не перехватывается моим методом OnActionExecuted моего BaseController. Я думал, что могу поместить код ведения журнала на саму страницу Error.aspx, но я не уверен, как получить информацию об ошибке на этом уровне.
источник
Ответы:
Я бы подумал об упрощении вашего веб-приложения, подключив Elmah .
Вы добавляете сборку Elmah в свой проект, а затем настраиваете свой web.config. Затем он будет регистрировать исключения, созданные на уровне контроллера или страницы. Его можно настроить для входа в различные места (например, SQL Server, электронную почту и т. Д.). Он также предоставляет веб-интерфейс, так что вы можете просматривать журнал исключений.
Это первое, что я добавляю в любое создаваемое мной приложение asp.net mvc.
Я все еще использую log4net, но стараюсь использовать его для регистрации отладки / информации и оставляю все исключения на усмотрение Elmah.
Вы также можете найти дополнительную информацию в вопросе Как вы регистрируете ошибки (исключения) в своих приложениях ASP.NET? .
источник
Вы можете подключиться к событию OnError в Global.asax.
Что-то вроде этого:
источник
Server
всегда будет отличным от нуля.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3
Create Attribute, который наследуется от HandleErrorInfoAttribute и включает ваш выбор ведения журнала
Поместите атрибут в Global.asax RegisterGlobalFilters
источник
Вы думали о расширении атрибута HandleError? Кроме того , Скотт имеет хороший блог о фильтровальных перехватчиков на контроллеры / действия здесь .
источник
Представление Error.aspx определяется следующим образом:
HandleErrorInfo имеет три свойства: строка ActionName string ControllerName Exception Exception
У вас должен быть доступ к HandleErrorInfo и, следовательно, к исключению в представлении.
источник
Вы можете попробовать изучить HttpContext.Error, но я не уверен в этом.
источник