log4net与C#扩展方法|表现

log4net and C# extension method | the performance

我写了一个简单的扩展,应该允许我在任何 class.

中调用方法 GetLogger
static class Log4NetExtension {
    public static ILog GetLogger(this object cls) {
        return LogManager.GetLogger(cls.GetType());
    }
}

所以,我可以从不同的 class 登录,如下所示:

class Test1 {
    public void method() {
        this.GetLogger ().Fatal ("Lorem ipsum no dolor...");
    }
}
class Test2 {
    public void method() {
        this.GetLogger().Error("Lorem ipsum no dolor...");
    }
}

我的问题是,LogManager.GetLogger() 方法调用到底做了什么? 它是否每次在其方法调用时都创建记录器?如果我定期调用 this.GetLogger() ,这种方法对我的应用程序有很大影响吗?

这一切都是基于我的假设,但要回答这个问题...

Does it creates the logger every time on its method call?

这个记录器很可能遵循 singleton 模式,如果它不存在,它将创建一个自己的实例。然后,如果调用任何新的 getLogger 调用,它将 return 激活实例。记录器只创建一次。

Does such approach have a great impact on my application in case I call this.GetLogger() regularly?

如果上述假设被证明是正确的,那么对您的程序应该几乎没有影响。大多数单线程记录器通常遵循单例模式。如果您正在使用多个线程,那么这会变得有点棘手。

根据 Log4net documentationGetLogger() 调用将查找具有该名称(您提供的 class 名称)的记录器,如果不存在则只创建一个。这就是您将获得的最佳性能 - 仅在尚未创建记录器时延迟创建记录器。