我应该在每个类或基类中声明一次log4net记录器吗?

dev*_*per 21 .net c# log4net

声明一个记录器并LogManager.GetLogger在基类中调用似乎更干净,这样每个继承的人都可以使用它.但是,在log4net网站和此博客文章中的其他博客中,它声明最好为每个类声明一个记录器,因为:

您可以通过这种方式使用记录器来隔离对象的日志记录问题,我完全建议您这样做.这将使您能够使用log4net的分层配置机制来限制和指示来自各个记录器的日志输出.

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

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

Gro*_*roo 23

该帖子并没有明确告诉您在每个派生类中使用不同的记录器,而是通常每个类类型使用不同的记录器.您可以,但不必在每个派生类中使用新的记录器实例.

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

此外,该文章实例化记录器,如下所示:

static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType );
Run Code Online (Sandbox Code Playgroud)

虽然可能会使用一种稍微简单的方法:

static readonly ILog Log = LogManager.GetLogger(typeof(YourClass));
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*der 5

通常的做法是每个类有一个记录器,而不是基类.这样,您可以基于每个类启用/禁用日志记录.

我可能还建议使用Common Logging 2.0,http://netcommon.sourceforge.net/.

目前正在使用的.NET有各种日志记录实现,log4net,Enterprise Library Logging,NLog,这些都是最受欢迎的.具有不同实现的缺点是它们不共享公共接口,因此会对库的用户强加特定的日志记录实现.

Common.Logging库引入了一个简单的抽象,允许您在运行时选择特定的日志记录实现.因此,您可以推迟决定在部署之前使用的特定日志库.适配器用于将特定的日志记录系统插入Common.Logging.


Dot*_*ser -2

通常您应该有一个记录器类,您可以使用单例模式并确保您的应用程序只有一个记录器实例。

编辑:现在已使其线程安全,感谢您的评论。

    public class Logger
    { 
      private static object syncRoot = new Object();
      private static Logger instance=null;
      // private constructor
      private Logger()
      {
      }
      /// <summary>
    /// Gets an instance with default parameters based upon the caller
    /// </summary>
    /// <returns></returns>
    public static Logger GetInstance()
    {
       // make sure you return single instance
       if (instance == null)
        {
           lock (syncRoot) 
           { 
            instance=new Logger();
           } 
        }
        return instance;
    }
   }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 我知道我迟到了,但是您需要在锁内再次将“instance”与 null 进行比较,以确保线程安全,因为另一个线程可以在第一个 if 之后但在锁之前跳转。有关更多详细信息,请参阅[双重检查锁定](http://en.wikipedia.org/wiki/Double-checked_locking)。 (2认同)