570

ELMAH を使用して ASP.NET MVC アプリケーションでエラーをログに記録しようとしていますが、コントローラーで [HandleError] 属性を使用すると、エラーが発生しても ELMAH はログに記録しません。

私が推測しているように、ELMAH は未処理のエラーのみをログに記録し、[HandleError] 属性はエラーを処理しているため、ログに記録する必要はありません。

ELMAH がエラーが発生したことを認識してログに記録できるように、属性を変更する方法または属性を変更する方法を教えてください。

編集:誰もが理解していることを確認させてください。私が求めている質問ではない属性を変更できることはわかっています... ELMAH は、handleerror 属性を使用するとバイパスされます。つまり、処理されたためにエラーが発生したことがわかりません。すでに属性によって...私が求めているのは、属性がそれを処理したとしても、ELMAHにエラーを表示させてログに記録させる方法があるということです.エラー....

4

8 に答える 8

303

申し訳ありませんが、受け入れられた答えはやり過ぎだと思います。あなたがする必要があるのはこれだけです:

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());
}
于 2011-05-09T12:27:32.847 に答える
8

上記のコードを使用して、すべてのコントローラーに HandleErrorWithElmah 属性を挿入するカスタム コントローラー ファクトリを導入することで、さらに一歩進めることができます。

詳細については、MVC でのログインに関する私のブログ シリーズをご覧ください。最初の記事では、MVC 用に Elmah をセットアップして実行する方法について説明しました。

記事の最後に、ダウンロード可能なコードへのリンクがあります。それが役立つことを願っています。

http://dotnetdarren.wordpress.com/

于 2010-07-28T00:19:15.273 に答える
7

ASP.NET MVC は初めてです。私は同じ問題に直面しました.

@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> 

それは単純です!

于 2011-04-20T01:40:02.977 に答える
6

私にとって、電子メールのログを機能させることは非常に重要でした。しばらくして、これには Atif の例でさらに 2 行のコードしか必要ないことがわかりました。

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

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

これが誰かを助けることを願っています:)

于 2011-01-26T09:11:26.723 に答える
3

これはまさに、MVC サイトの構成に必要なものです。

Atif Aziz の提案に従って、OnException複数のインスタンスを処理するためにメソッドに少し変更を加えました。HandleErrorAttribute

HandleErrorAttribute複数のインスタンスが有効な場合、重複したログが発生しないように注意する必要があることに注意してください。

context.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);
}
于 2010-11-06T22:35:52.310 に答える