4

我想记录对我的 MVC 3 应用程序的所有请求,包括请求的 URL、用户的 IP 地址、用户代理等。最好的地方是哪里,

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")

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

于 2013-07-24T08:47:49.393 回答