MVC3最佳请求日志记录方式

4
我希望记录我 MVC 3 应用程序的所有请求日志,包括请求的 URL、用户的 IP 地址和用户代理等。最佳记录位置在哪里?
1)使用基础控制器?
2)使用操作筛选器?
3)其他?

1
IIS难道不已经为你做了这件事吗? - Babak Naffas
3个回答

6

如果问我,一个HttpModule似乎是最合适的选择。

您提到的所有日志记录数据都可以在任何特定控制器调用之前获得。因此,如果您在控制器外记录日志,则可以捕获甚至不是有效控制器操作的请求。而且没有必要在控制器代码中添加实际上是横切关注点的内容。


1
我喜欢你的想法,也同意你所说的,但这次我会选择像Leniel建议的基础控制器,因为它更容易整合。如果以后我有更多时间,我可以切换到httpModule。 - Laguna
使用ASP.NET应用程序事件如Application_BeginRequest/_EndRequest或Application_BeginAuthenticateRequest/_EndAuthenticateRequest怎么样?在那里放置日志记录代码是否有缺点? - Ronald Zarīts
1
@RonaldZarīts:关注点分离。记录日志不是Global.asax.cs的目的,因此记录代码不应该放在那里。如果您按照一种方式设置事物,以响应这些相同的事件并将记录代码保留在其自己的类中,我会接受。但这基本上就是HttpModules的作用。 - StriplingWarrior

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

当渲染单个请求时,您可以触发多个操作方法。在您的布局页面上使用RenderAction进行如下考虑:

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

值得注意的是,如果您选择使用操作筛选器进行日志记录,则会有两个具有相同信息的日志条目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接