2012-06-08 31 views
3

我使用log4net的,其中我是一个静态类中获得像这样的记录一个基准保持到记录器的引用:在一个静态类

internal static class Constants 
{ 
    public static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
} 

,并使用全像这样的应用程序,参考:

Constants.Log.Info(_message); 

但是我有这样的感觉,这可能会导致问题,我意识到常量(全局?)变量可能是一件坏事。

  • 这种方法有什么问题吗?
  • 是什么原因?
  • 可以做些什么来解决这些问题?

回答

-1

这实质上创造了一个signleton,其中有许多问题,包括进行有效的单元测试。单元测试不需要记录并引入不必要的依赖关系。

您应该考虑使用IoC容器和依赖项注入。

+2

如何依赖日志解决方案干扰有效的单元测试?我很想看到一个例子。 – tsells

+0

我同意@tsells:记录可能是规避单身人士的最佳例外(尽管拥有* single * logger是我不主张的)。如果您使用的是日志记录框架,我非常怀疑您是否需要自己测试记录器,或者注入记录器模拟器?我认为在为单元测试启用日志记录功能时没有太大的伤害,日志级别可以根据需要进行不同的配置,而且只能帮助解决问题。 – Groo

10

如果您希望能够轻松区分日志级别并为每个类使用不同的日志目标(“appender”),那么您是对的,即不是最佳方法

它通常建议每个类都有一个静态ILog情况下,后命名的完全合格的类型:

namespace Animals 
{ 
    public class Dog 
    { 
     private static readonly ILog Log = LogManager.GetLogger(typeof(Dog)); 
    } 

    public class Cat 
    { 
     private static readonly ILog Log = LogManager.GetLogger(typeof(Cat)); 
    } 
} 

虽然这看起来像是与具有单更多的工作,它证明了在长期非常方便。一旦你做到了这一点,很容易区分通过配置文件DogCat日志级别(例如与log4net语法所示):

<log4net> 

    <!-- appender definitions ommited --> 

    <!-- default for all loggers in Animals namespace --> 
    <logger name="Animals"> 
    <level value="WARN"/> 
    </logger> 

    <!-- ...but we need full debug for Dogs --> 
    <logger name="Animals.Dog"> 
    <level value="DEBUG"/> 
    </logger> 

    <!-- ...and we want to send Cat messages over e-mail --> 
    <logger name="Animals.Cat"> 
    <level value="INFO"/> 
    <appender-ref ref="SmtpAppender"/> 
    </logger> 

</log4net> 

日志框架log4net的一样也使用的hierarchical logging的概念:一个记录器被称为另一个记录器的祖先,如果它的名字后跟一个点是后代记录器名称的前缀。要使用此功能,最好避免手动命名记录器(使用硬编码string),而是使用类型信息来包含整个名称空间。

+0

我不同意这种方法。这就要求每个班级的“管道”代码都是浪费的,并且容易出错。如果您的日志记录解决方案构建得很好 - 可以静态引用它。许多高端系统都是以这种方式构建的。 – tsells

+0

@tsells - 我必须承认这是我读过这个答案时的想法,但我怀疑mysef,因此问题的原因。 –

+2

@tsells:好吧,我知道许多系统的构建方式与我在回答中描述的方式完全相同(例如,使用NHibernate记录器)。这*是'log4net'推荐的方法,我在这里看不到可能的失败点(“浪费并容易出错”)。这也是创建性能影响最小的方法,因为对运行时记录器类型解析(如果有单个记录器时需要这样做)更少,更不用说线程同步了。如果你有一个这样的“精心打造的测井系统”的具体例子,那就分享一下吧。 – Groo