MVC3记录请求的最佳方式

时间:2012-09-06 17:18:47

标签: asp.net-mvc asp.net-mvc-3 logging request

我想记录我的MVC 3应用程序的所有请求,包括请求的URL,用户的ip地址,用户代理等。最佳位置在哪里,

1)使用基础控制器?

2)使用动作过滤器?

3)其他人?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:6)

如果你问我,

An HttpModule似乎是最合适的。

在调用任何特定的Controller之前,所有关于日志记录的数据都可用。因此,如果您在控制器外部进行日志记录,那么您甚至可以捕获那些不是有效控制器操作的请求。并且不需要将控制器代码混乱,这实际上是一个跨领域的问题。

答案 2 :(得分:-1)

在呈现单个请求时,您可以触发多个操作方法。请考虑在布局页面上使用RenderAction,如下所示:

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

值得注意的是,如果您选择使用操作过滤器进行日志记录,那么您将拥有两个具有相同信息的日志条目。