记录ASP.NET MVC中的错误
我目前在我的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.aspx页面中的Shared.aspx页面,但它肯定不会被我的BaseController的OnActionExecuted方法捕获。 我想我可能会把日志代码放在Error.aspx页面上,但我不确定如何检索该级别的错误信息。
我会考虑通过插入Elmah来简化您的Web应用程序。
将Elmah程序集添加到项目中,然后配置web.config。 然后它将记录在控制器或页面级别创建的异常。 它可以配置为登录到各种不同的地方(如SQL Server,电子邮件等)。 它还提供一个Web前端,以便您浏览异常日志。
它是我添加到我创建的任何asp.net mvc应用程序的第一件事。
我仍然使用log4net,但我倾向于使用它来记录调试/信息,并将所有例外保留给Elmah。
您也可以在问题中找到更多信息如何在ASP.NET应用程序中记录错误(例外)?
您可以钩入Global.asax中的OnError事件。
像这样的东西:
/// <summary>
/// Handles the Error event of the Application control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Application_Error(object sender, EventArgs e)
{
if (Server != null)
{
Exception ex = Server.GetLastError();
if (Response.StatusCode != 404 )
{
Logging.Error("Caught in Global.asax", ex);
}
}
}
MVC3
创建从HandleErrorInfoAttribute继承的属性,并包含您选择的日志记录
public class ErrorLoggerAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
LogError(filterContext);
base.OnException(filterContext);
}
public void LogError(ExceptionContext filterContext)
{
// You could use any logging approach here
StringBuilder builder = new StringBuilder();
builder
.AppendLine("----------")
.AppendLine(DateTime.Now.ToString())
.AppendFormat("Source:t{0}", filterContext.Exception.Source)
.AppendLine()
.AppendFormat("Target:t{0}", filterContext.Exception.TargetSite)
.AppendLine()
.AppendFormat("Type:t{0}", filterContext.Exception.GetType().Name)
.AppendLine()
.AppendFormat("Message:t{0}", filterContext.Exception.Message)
.AppendLine()
.AppendFormat("Stack:t{0}", filterContext.Exception.StackTrace)
.AppendLine();
string filePath = filterContext.HttpContext.Server.MapPath("~/App_Data/Error.log");
using(StreamWriter writer = File.AppendText(filePath))
{
writer.Write(builder.ToString());
writer.Flush();
}
}
在Global.asax RegisterGlobalFilters中放置属性
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// filters.Add(new HandleErrorAttribute());
filters.Add(new ErrorLoggerAttribute());
}
链接地址: http://www.djcxy.com/p/74343.html
上一篇: Logging errors in ASP.NET MVC
下一篇: MVC View Problem