我目前在我的 ASP.NET MVC 应用程序中使用 log4net 来记录异常。我这样做的方法是让我的所有控制器从 BaseController 类继承。在 BaseController 的 OnActionExecting 事件中,我记录可能发生的任何异常:
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);
}
}
This works great if an unhandled exception occurred during a controller action.
至于404错误,我在 web.config 中设置了一个自定义错误,如下所示:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
在处理“ page-not-found”url 的控制器操作中,我记录被请求的原始 url:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
And this also works.
我遇到的问题是如何记录。Aspx 页面本身。假设某个页面出现编译错误,或者某个内联代码抛出异常:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
看起来 HandleError 属性正在将其重新路由到我的共享文件夹中的 Error.aspx 页面,但是它肯定没有被 BaseController 的 OnActionExecated 方法捕获。我想也许我可以把日志代码放在 Error.aspx 页面上,但是我不确定如何在那个级别检索错误信息。