2011-09-29 57 views
2

我是一个.NET/C#小白(长时间的servlet/Java开发人员)MVC记录:LogRequest] VS OnActionExecuting

我需要记录添加到我的MVC应用程序。我希望它在性能方面相当便宜,而且配置起来很简单。

我最初想做的是记录每个传入的控制器操作。我想到可能有一个单点入口,所以我不必为每个控制器的操作方法添加一行代码。

我看到的方式,我可以添加[LogRequest]属性到控制器(在我的情况下,基本控制器),然后执行一个

public class LogsRequestsAttribute : ActionFilterAttribute, IActionFilter 
{ 
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    { ... } 
} 

类来处理logrequest属性。

我可以覆盖基本控制器按:

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // perform some action here 
    } 
} 

和继承BaseController我所有的控制器。

在性能方面,哪个会更快?


此外,在性能方面,我正在考虑把实际测井方法调用的运行一次,死一个无阻塞线程。这种方法有什么陷阱?目标是让应用程序继续进行,而不是等待日志记录方法完成任务。

回答

4

如果您使用的是MVC3,我建议您将操作过滤器添加到全局过滤器集合中,而不是需要基本控制器。在应用程序启动时,在您的Global.asax(“MvcApplication”)类,你需要这样一行:

GlobalFilters.Filters.Add(new LogRequestsAttribute()); 

这将运行所有的控制器动作。

从性能的角度来看,我不认为你会看到属性或基本控制器机制之间的很多区别。我没有尝试过,但由于MVC管道的动作过滤器部分将会运行,不管你有没有基础控制器,这里真正考虑的将是灵活性而不是性能。更灵活的设计是将记录与控制器隔离开来。

我想看看使用第三方日志解决方案,如log4net,它已经针对速度进行了优化并且经过了充分测试。这将允许您避免启动异步日志记录线程等等。只需在您的动作过滤器中登录到log4net,并将其称为好。这也可以让你在每个appender的基础上完成异步部分 - 更多的控制。如果您需要异步日志记录,请将您的log4net appender编写为异步日志,而不是使用异步行为包装所有各种日志记录调用。

+0

感谢您的信息。我明白你说的log4net正在优化,但它阻止了吗?或者你会推荐的日志过滤器只是运行异步? ...还有一个问题,我与log4net/j是缺乏自定义与字段保存到分贝。我想添加用户名,也许还有一些其他的东西到日志记录和查询它后来不必做一个“喜欢”的消息字段。 – horace

+0

至于旋转异步记录,'什么也没有:[链接] http://www.singingeels.com/Articles/Logging_with_ASPNET_MVC_Action_Filters。aspx [/ link] – horace

+0

我按照你的rec实现了这个,它非常好。增加了过滤器,它就像魔术一样工作! ---我确实喜欢这样一个事实,即我不必担心控制器是否具有与其相关的一些神奇属性以用于记录。简单。清洁。作品。 – horace