在全局操作过滤器中记录日志的性能影响

performance inpact of logging inside global action filters

我根据这个答案创建了一个全局动作过滤器来测量动作执行时间Measure Time Invoking ASP.NET MVC Controller Actions

我想使用 log4net 记录结果。 我想知道为每次调用创建一个记录器是否会对性能产生影响。 我的每个控制器中都有一个 ILog 的静态实例,定义如下

private static ILog logger = log4net.LogManager.GetLogger(typeof(CompteController));

我可以直接在操作过滤器中访问它吗?

或者有更好的方法吗?

您可以在操作过滤器中访问控制器类型并使用控制器类型实例化记录器 (typeof(filterContext.Controller.GetType()))。如果您创建一个单例并在 array/collection 中分配每个新的控制器类型记录器,您应该能够在以后的请求中访问它。

如果控制器的记录器在单例中不存在,那么此时创建一​​个新的。实例化新记录器的成本仍然存在,但仅在创建新记录器时才会存在。

我为减少记录器开销所做的是在 Global.asax.cs

中为整个应用程序创建一个静态记录器
public static ILog logger = LogManager.GetLogger(typeof(MvcApplication));