Наразі я використовую log4net в моєму додатку ASP.NET MVC для журналу винятків. Я це роблю, завдяки тому, що всі мої контролери успадковують клас BaseController. У події 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, але я не впевнений, як отримати інформацію про помилку на цьому рівні.