为什么我们应该将«Logger»类视为单身?

时间:2010-11-03 09:04:09

标签: design-patterns logging singleton

我们都知道log,好吧,但为什么我们应该将«Logger»类视为单例?如果我们将它作为普通的 -singleton类?

会发生什么?

4 个答案:

答案 0 :(得分:14)

我在IBM网站上找到了这个。它很好地解释了Logger Singleton类的用法。

  

真正的单身人士的典型例子   是一种日志服务。假设我们有   基于事件的日志记录服务:客户端   对象请求记录文本   向记录发送消息   服务。其他对象实际登录   某处的文字(控制台,文件,   通过听日志记录   为这些日志记录请求提供服务   处理它们。首先,请注意   日志服务传递经典   测试单身人士:

     
      
  • 请求者需要一个向其发送请求的众所周知的对象   登录。这意味着一个全球性的观点   访问。
  •   
  • 由于日志记录服务是多个事件源   听众可以注册,只有   需要成为一个实例。
  •   

此处链接:Use your singletons wisely

如果您不使用单例类,则必须处理这些不同记录器实例之间的同步(写入文件或您使用的任何流)。因此,当您只有一个全局Logger实例时,它会更容易。

答案 1 :(得分:4)

主要问题是实际日志的持久性。

如果您正在编写文件系统,那么拥有多个实例(因此可能包含多个线程)可能会导致文件出现乱码。

在某种意义上,依赖于缓冲和其他低级机制,来自一个写入的消息可能最终与来自其他人的消息(或消息的一部分)混合在一起。

这可能是一个小问题,但它是我唯一能想到的关于只有一个(因而是串行)日志写入对象的问题。

答案 2 :(得分:2)

如果您有多个具有不同内容的日志流,则可以使用为不同输出初始化的多个记录器类实例。

但是,如果您只有一个日志流,则具有多个记录器类实例会导致实现更复杂,因为实例必须协同工作来管理实际资源。例如,考虑使用序列号记录每条消息的记录器。两个实例必须同步它们的序列计数器,这需要它们相互缠绕,协商计数器增加等等。 (在静态类成员中具有共享计数器的替代方法相当于具有单例记录器)

答案 3 :(得分:0)

取决于日志记录框架。通常,您希望所有消息都转到一个日志,因此您希望所有代码都使用相同的记录器。但是记录器类不一定是单例来确保。