2016-02-27 86 views
0

我已经写了一个简单的扩展,应该允许我这样称呼方法GetLogger任何类。log4net和C#扩展方法|性能

static class Log4NetExtension { 
    public static ILog GetLogger(this object cls) { 
     return LogManager.GetLogger(cls.GetType()); 
    } 
} 

所以,我可以从不同的类日志如下:

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(),这种方法对我的应用程序有很大的影响吗?

+4

不回答你的问题,但为什么不注入一个'ILogService'到你的类需要记录呢? 'myString.GetLogger()'会发生什么? – MaYaN

+0

它会创建一个新的记录器。有趣的,但如果我希望从该类登录,那么该类应该实现的创建接口如何。然后你可以做一些像公共静态ILog GetLogger(这个IMyType cls); –

+0

看看:Benchmarker项目上的https://github.com/NimaAra/Easy.Logger,你可以看到如何将Log4NetService注入你的类。 – MaYaN

回答

0

这是所有基于关我的假设,但要回答这个...

它创建它的方法调用每一次记录仪?

该记录器最有可能遵循singleton模式,如果该模式不存在,该模式将创建它自己的一个实例。然后,如果调用任何新的getLogger调用,它将返回活动实例。记录器只创建一次。

这种方法对我的应用程序有很大的影响,以防万一我定期调用this.GetLogger()吗?

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

+0

根据@RyanR和Log4net文档,你的假设被证明是正确的。 ;) –

0

根据Log4net documentationGetLogger()调用将查找具有该名称(您提供的类名称)的记录器,并且只有创建一个记录器(如果它不存在)。这是关于你要获得最佳的性能 - 懒人创造记录的,只有当它有没有。