3

我是 .net/c# noob(长期 servlet/java 开发人员)

我需要将日志记录添加到我的 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

1 回答 1

4

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

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

这将为所有控制器操作运行它。

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

我会考虑使用像log4net这样的第三方日志解决方案,它已经针对速度进行了优化并且经过了充分测试。这将允许您避免启动异步日志记录线程和所有这些。只需在您的操作过滤器中登录 log4net 并称之为好。这也允许您在每个附加程序的基础上执行异步部分 - 更多控制。如果您需要异步日志记录,请将 log4net appender 编写为异步的,而不是使用异步行为包装所有各种日志记录调用。

于 2011-09-29T16:46:05.773 回答