ASP.NETMVC中的日志记录错误怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

我目前在我的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。

用户回答回答于

可以连接到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);
        }

    }


}

扫码关注云+社区

领取腾讯云代金券