c# – 我应该每个类或基类声明log4net记录器一次吗?

在基类中声明一个记录器并调用LogManager.GetLogger看起来更清晰,以便所有继承的人都可以使用它。然而,在log4net网站和其他类似于this blog post的博客中,它表示,最好每个类声明一个记录器,因为:

You can use loggers this way to isolate logging concerns across your objects, and I wholly recommend you do so. This will enable you to throttle and direct log output from individual loggers using log4net’s hierarchical configuration mechanism.

这是否意味着如果我把它放在基类中,会使该记录器成为瓶颈?

如果是这样,还有其他解决方案,还是只需要为每个类创建一个记录器?

该帖子并不具体告诉您在每个派生类中使用其他记录器,而是通常根据类类型使用不同的记录器。您可以,但不必在每个派生类中使用新的记录器实例。

查看它的一种方法是,同时实例化两个单独的记录器可能会令人困惑(因为基础仍然存在),特别是如果您使用相同的记录器名称隐藏基础记录器。您的基类方法(不被覆盖)仍将引用基本静态记录器,并且重写的方法将使用不同的方法。

此外,文章实例化了这样的记录器:

static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType );

而稍微简单一些的方法可能是使用:

static readonly ILog Log = LogManager.GetLogger(typeof(YourClass));

首先,它被标记为只读,这意味着一旦初始化,您将无法无意中更改该字段。并且使用该类型将以与反射相同的方式工作,但稍微更快(在编译时解析)。如果您选择重命名它(它不会使用字符串重载),Visual Studio也会自动更新类名。

翻译自:https://stackoverflow.com/questions/9071784/should-i-declare-log4net-logger-once-per-class-or-in-base-class

转载注明原文:c# – 我应该每个类或基类声明log4net记录器一次吗?