我是.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继承我的所有控制器。
在性能方面,会更快?
另外,就性能而言,我正在考虑将实际的日志记录方法调用放在一个运行一次且死掉的非阻塞线程中。这种方法有什么陷阱吗?目标是让应用程序继续进行,而不是等待日志记录方法完成它的任务。
答案 0 :(得分:4)
如果您正在使用MVC3,我建议您将动作过滤器添加到全局过滤器集合,而不是需要基本控制器。在应用启动时,在Global.asax(“MvcApplication”)类中,您需要一行:
GlobalFilters.Filters.Add(new LogRequestsAttribute());
这将为所有控制器操作运行它。
从性能角度来看,我认为您不会发现属性或基本控制器机制之间存在太大差异。我没有尝试过,但由于MVC管道的动作过滤器部分无论你有没有基本控制器都会运行,这里真正的考虑因素是灵活性而不是性能。更灵活的设计是将记录与控制器隔离开来。
我会考虑使用像log4net这样的第三方日志解决方案,该解决方案已针对速度进行了优化并经过了充分测试。这将允许您避免必须启动异步日志记录线程以及所有这些。只需在动作过滤器中登录log4net并将其调用即可。这也允许您在每个appender的基础上执行异步部分 - 更多控制。如果需要异步日志记录,请将log4net appender编写为异步,而不是使用异步行为包装所有各种日志记录调用。