リクエストされたURL、ユーザーのIPアドレス、ユーザーエージェントなど、MVC3アプリへのすべてのリクエストのログを保持したい。これを行うのに最適な場所はどこですか。
1)ベースコントローラーを使用しますか?
2)アクションフィルターを使用しますか?
3)他の人?
リクエストされたURL、ユーザーのIPアドレス、ユーザーエージェントなど、MVC3アプリへのすべてのリクエストのログを保持したい。これを行うのに最適な場所はどこですか。
1)ベースコントローラーを使用しますか?
2)アクションフィルターを使用しますか?
3)他の人?
これは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)
あなたが私に尋ねれば、は最適のHttpModule
ようです。
ロギングについて話しているすべてのデータは、特定のコントローラーが呼び出されるかなり前に利用可能です。したがって、コントローラーの外部でロギングを行うと、有効なコントローラーアクションではない要求もキャプチャできます。そして、本当に横断的関心事である何かでコントローラーコードを乱雑にする必要はありません。
単一のリクエストをレンダリングするときに、複数のアクションメソッドをトリガーすることができます。次のように、レイアウトページでRenderActionを使用することを検討してください。
Html.RenderAction("Navigation", "Menu")
ロギングにアクションフィルターを使用することを選択した場合、同じ情報を持つ2つのログエントリがあることに注意してください。