4

リクエストされたURL、ユーザーのIPアドレス、ユーザーエージェントなど、MVC3アプリへのすべてのリクエストのログを保持したい。これを行うのに最適な場所はどこですか。

1)ベースコントローラーを使用しますか?

2)アクションフィルターを使用しますか?

3)他の人?

4

3 に答える 3

6

これはBaseController内で行います。このようなもの:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    // If in Debug mode...
    if (filterContext.HttpContext.IsDebuggingEnabled)
    {
        var message = string.Format(CultureInfo.InvariantCulture,
                                    "Leaving {0}.{1} => {2}",
                                    filterContext.Controller.GetType().Name,
                                    filterContext.ActionDescriptor.ActionName.Trim(),
                                    filterContext.Result);
        Logger.Debug(message);
    }

    // Logs error no matter what
    if (filterContext.Exception != null)
    {
        var message = string.Format(CultureInfo.InvariantCulture,
                                    "Exception occured {0}.{1} => {2}",
                                    filterContext.Controller.GetType().Name,
                                    filterContext.ActionDescriptor.ActionName.Trim(),
                                    filterContext.Exception.Message);
         Logger.Error(message);
     }

     base.OnActionExecuted(filterContext);
}

あなたがアイデアを得ることを願っています。

次を使用して、アクションが実行される前にログに記録することもできます。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
于 2012-09-06T17:21:28.570 に答える
6

あなたが私に尋ねれば、は最適のHttpModuleようです。

ロギングについて話しているすべてのデータは、特定のコントローラーが呼び出されるかなり前に利用可能です。したがって、コントローラーの外部でロギングを行うと、有効なコントローラーアクションではない要求もキャプチャできます。そして、本当に横断的関心事である何かでコントローラーコードを乱雑にする必要はありません。

于 2012-09-06T17:22:17.060 に答える
-1

単一のリクエストをレンダリングするときに、複数のアクションメソッドをトリガーすることができます。次のように、レイアウトページでRenderActionを使用することを検討してください。

Html.RenderAction("Navigation", "Menu")

ロギングにアクションフィルターを使用することを選択した場合、同じ情報を持つ2つのログエントリがあることに注意してください。

于 2013-07-24T08:47:49.393 に答える