如何获取共享error.cshtml的异常详细信息

rka*_*ano 7 asp.net asp.net-mvc log4net exception-handling razor

我正在使用ASPNet MVC4和在Global.asax上配置的HandleErrorAttribute过滤器

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}
Run Code Online (Sandbox Code Playgroud)

在我的web.config上,我已将customError模式配置为RemoteOnly:

<customErrors mode="RemoteOnly" />
Run Code Online (Sandbox Code Playgroud)

因此,当在任何View上引发异常时,用户被重定向到〜/ Shared/Error.cshtml,这没关系.

现在,我可以捕获日志的这个异常:

〜/ Shared/Error.cshtml代码:

@{
    log4net.LogManager
      .GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
      .Fatal("Not captured exception", ex);
}
Run Code Online (Sandbox Code Playgroud)

实际上这段代码工作正常(没有EX参数),但我需要改进我的日志,包括异常细节.

我如何在此页面上获取异常详细信息?

Dar*_*rov 10

只需将您的Error.cshtml视图强类型HandleErrorInfo化为HandleErrorAttribute传递给此视图的模型:

@model System.Web.Mvc.HandleErrorInfo
@{
    log4net
        .LogManager
        .GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
        .Fatal("Not captured exception", Model.Exception);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,在视图中记录似乎不是你能做的最干净的事情.我宁愿编写自定义错误处理程序属性并在那里记录异常.


dov*_*ove 8

我建议编写自定义处理程序并在其中登录,例如

[AttributeUsage(AttributeTargets.All, Inherited = true)]
public class HandleErrorAttributeCustom : HandleErrorAttribute
{

    public override void OnException(ExceptionContext context)
    {
                base.OnException(context);
           log4net.LogManager
          .GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
          .Fatal("Not captured exception", context.Exception);
    }
}
Run Code Online (Sandbox Code Playgroud)