我正在尝试使用ELMAH来记录我的ASP中的错误。NET MVC应用程序,然而,当我使用[HandleError]属性在我的控制器ELMAH不会记录任何错误时,他们发生。

我猜这是因为ELMAH只记录未处理的错误,[HandleError]属性正在处理错误,因此不需要记录它。

我如何修改或如何修改属性,以便ELMAH可以知道有一个错误并记录它。

编辑:让我确保每个人都明白,我知道我可以修改属性,这不是我问的问题…当使用handleerror属性时,ELMAH会被绕过,这意味着它不会看到有错误,因为它已经被属性处理了……我问的是有一种方法让ELMAH看到错误并记录它,即使属性处理它…我四处搜索,没有看到任何方法来调用强制它记录错误....


当前回答

这正是我的MVC站点配置所需要的!

我添加了一个小修改OnException方法来处理多个HandleErrorAttribute实例,由Atif Aziz建议:

请记住,如果多个HandleErrorAttribute实例生效,则不会发生重复的日志记录。

我只是检查上下文。在调用基类之前调用ExceptionHandled,只是为了知道是否有人在当前处理程序之前处理了异常。 它适用于我,我发布了代码,以防其他人需要它,并询问是否有人知道我是否忽略了什么。

希望对大家有用:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}

其他回答

我是ASP的新手。净MVC。我也遇到过同样的问题,以下是我在工作中犯的错误。vbhtml(如果你只需要使用Elmah log记录错误,它可以工作)

@ModelType System.Web.Mvc.HandleErrorInfo

    @Code
        ViewData("Title") = "Error"
        Dim item As HandleErrorInfo = CType(Model, HandleErrorInfo)
        //To log error with Elmah
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(New Elmah.Error(Model.Exception, HttpContext.Current))
    End Code

<h2>
    Sorry, an error occurred while processing your request.<br />

    @item.ActionName<br />
    @item.ControllerName<br />
    @item.Exception.Message
</h2> 

很简单!

对我来说,让电子邮件日志工作是非常重要的。一段时间后,我发现这只需要2行代码在Atif的例子。

public class HandleErrorWithElmahAttribute : HandleErrorAttribute
{
    static ElmahMVCMailModule error_mail_log = new ElmahMVCMailModule();

    public override void OnException(ExceptionContext context)
    {
        error_mail_log.Init(HttpContext.Current.ApplicationInstance);
        [...]
    }
    [...]
}

我希望这能帮助到一些人:)

这正是我的MVC站点配置所需要的!

我添加了一个小修改OnException方法来处理多个HandleErrorAttribute实例,由Atif Aziz建议:

请记住,如果多个HandleErrorAttribute实例生效,则不会发生重复的日志记录。

我只是检查上下文。在调用基类之前调用ExceptionHandled,只是为了知道是否有人在当前处理程序之前处理了异常。 它适用于我,我发布了代码,以防其他人需要它,并询问是否有人知道我是否忽略了什么。

希望对大家有用:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}

抱歉,但我认为公认的答案是一个过度。你所需要做的就是:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
    public void OnException (ExceptionContext context)
    {
        // Log only handled exceptions, because all other will be caught by ELMAH anyway.
        if (context.ExceptionHandled)
            ErrorSignal.FromCurrentContext().Raise(context.Exception);
    }
}

然后在Global.asax.cs中注册它(顺序很重要):

public static void RegisterGlobalFilters (GlobalFilterCollection filters)
{
    filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
}

您可以使用上面的代码,进一步引入一个自定义控制器工厂,该工厂将HandleErrorWithElmah属性注入到每个控制器中。

要了解更多信息,请查看我关于登录MVC的博客系列。第一篇文章介绍了如何设置Elmah并运行MVC。

在本文末尾有一个可下载代码的链接。希望这能有所帮助。

http://dotnetdarren.wordpress.com/