我是 .net/c# 菜鸟(长期 servlet/java 开发人员)
我需要向我的 mvc 应用程序添加日志记录。我希望它在性能方面相当便宜,并且易于配置。
我最初想做的是记录每个传入的 Controller 操作。我突然想到可能有一个单点入口,所以我不必为每个 Controller 的操作方法添加一行代码。
在我看来,我可以向 Controller (在我的例子中是一个基本 Controller )添加一个 [LogRequest] 属性,然后实现一个
public class LogsRequestsAttribute : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{ ... }
}
处理日志请求属性的类。
或
我可以按照以下方式覆盖基本 Controller :
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// perform some action here
}
}
并从 BaseController 继承我所有的 Controller 。
在性能方面,哪个更快?
此外,就性能而言,我正在考虑将实际的日志记录方法调用放在一个运行一次就死掉的非阻塞线程中。这种方法有什么缺陷吗?目标是让应用程序继续运行,而不是等待日志记录方法完成它的任务。
最佳答案
如果您使用的是 MVC3,我建议您将操作过滤器添加到全局过滤器集合中,而不是需要基本 Controller 。在应用程序启动时,在您的 Global.asax(“MvcApplication”)类中,您需要这样一行:
GlobalFilters.Filters.Add(new LogRequestsAttribute());
这将为所有 Controller 操作运行它。
从性能的角度来看,我认为您不会在属性或基本 Controller 机制之间看到太多差异。我没有尝试过,但由于 MVC 管道的 Action 过滤器部分将运行,而不管您是否有基本 Controller ,因此这里真正考虑的是灵 active 而不是性能。更灵活的设计是将日志记录与 Controller 隔离。
我会考虑使用第三方日志解决方案,例如 log4net ,它已经针对速度进行了优化并经过了充分测试。这将允许您避免启动异步日志记录线程等等。只需在您的操作过滤器中登录到 log4net 并称之为好。这也允许您在每个附加程序的基础上执行异步部分——更多的控制。如果您需要异步日志记录,请将您的 log4net appender 编写为异步的,而不是使用异步行为包装所有各种日志记录调用。
关于.net - mvc 日志记录 : [LogRequest] vs OnActionExecuting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7600400/