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 documentation,GetLogger()
调用将查找具有该名称(您提供的 class 名称)的记录器,如果不存在则只创建一个。这就是您将获得的最佳性能 - 仅在尚未创建记录器时延迟创建记录器。
我写了一个简单的扩展,应该允许我在任何 class.
中调用方法 GetLoggerstatic 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 documentation,GetLogger()
调用将查找具有该名称(您提供的 class 名称)的记录器,如果不存在则只创建一个。这就是您将获得的最佳性能 - 仅在尚未创建记录器时延迟创建记录器。