1. ホーム
  2. asp.net-mvc

[解決済み] ASP.NET MVCにおけるエラーのログ記録

2022-09-30 16:40:57

質問

現在、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>

そして、"page-not-found" urlを処理するコントローラアクションでは、要求された元のurlを記録しています。

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
    log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));

    return View();
}

そして、これも動作します。

私が抱えている問題は、.aspx ページ自体にあるエラーをどのように記録するかということです。 例えば、ページの1つにコンパイルエラーがある、または例外を投げるいくつかのインラインコードがあるとします。

<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>

HandleError 属性は正しく Shared フォルダにある Error.aspx ページにリルートしているようですが、BaseController の OnActionExecuted メソッドでは確実に捕捉されません。 Error.aspx ページ自体にロギングコードを置くことができるかもしれないと考えていましたが、そのレベルでエラー情報を取得する方法がよくわかりません。

どのように解決するのですか?

Webアプリケーションをシンプルにするために、プラグインで エルマ .

Elmahのアセンブリをプロジェクトに追加し、web.configを設定します。コントローラやページレベルで発生した例外をログに記録します。様々な異なる場所(SQL Serverやメールなど)にログを記録するように設定することができます。また、Webフロントエンドを提供し、例外のログを参照することができます。

これは、私が作成するすべての asp.net mvc アプリに最初に追加するものです。

私はまだlog4netを使用していますが、デバッグや情報のログのために使用し、すべての例外はElmahに任せることが多いです。

また、より詳細な情報は、質問で紹介されている ASP.NETアプリのエラー(Exception)のログはどのように記録していますか? .