我想记录我的MVC 3应用程序的所有请求,包括请求的URL,用户的ip地址,用户代理等。最佳位置在哪里,
1)使用基础控制器?
2)使用动作过滤器?
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")
值得注意的是,如果您选择使用操作过滤器进行日志记录,那么您将拥有两个具有相同信息的日志条目。