我当前在ASP.NET MVC应用程序中使用log4net记录异常。我这样做的方法是让我所有的控制器都继承自BaseController类。在BaseController的OnActionExecuting事件中,我记录了可能发生的所有异常:
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属性可以正确地将此路由重新路由到Shared文件夹中的Error.aspx页面,但绝对不会被BaseController的OnActionExecuted方法捕获。我本以为可以将日志记录代码放在Error.aspx页面本身上,但是我不确定如何在该级别上检索错误信息。