我们都知道log,好吧,但为什么我们应该将«Logger»类视为单例?如果我们将它作为普通的非 -singleton类?
会发生什么?答案 0 :(得分:14)
我在IBM网站上找到了这个。它很好地解释了Logger Singleton类的用法。
真正的单身人士的典型例子 是一种日志服务。假设我们有 基于事件的日志记录服务:客户端 对象请求记录文本 向记录发送消息 服务。其他对象实际登录 某处的文字(控制台,文件, 通过听日志记录 为这些日志记录请求提供服务 处理它们。首先,请注意 日志服务传递经典 测试单身人士:
- 请求者需要一个向其发送请求的众所周知的对象 登录。这意味着一个全球性的观点 访问。
- 由于日志记录服务是多个事件源 听众可以注册,只有 需要成为一个实例。
此处链接:Use your singletons wisely
如果您不使用单例类,则必须处理这些不同记录器实例之间的同步(写入文件或您使用的任何流)。因此,当您只有一个全局Logger实例时,它会更容易。
答案 1 :(得分:4)
主要问题是实际日志的持久性。
如果您正在编写文件系统,那么拥有多个实例(因此可能包含多个线程)可能会导致文件出现乱码。
在某种意义上,依赖于缓冲和其他低级机制,来自一个写入的消息可能最终与来自其他人的消息(或消息的一部分)混合在一起。
这可能是一个小问题,但它是我唯一能想到的关于只有一个(因而是串行)日志写入对象的问题。
答案 2 :(得分:2)
如果您有多个具有不同内容的日志流,则可以使用为不同输出初始化的多个记录器类实例。
但是,如果您只有一个日志流,则具有多个记录器类实例会导致实现更复杂,因为实例必须协同工作来管理实际资源。例如,考虑使用序列号记录每条消息的记录器。两个实例必须同步它们的序列计数器,这需要它们相互缠绕,协商计数器增加等等。 (在静态类成员中具有共享计数器的替代方法相当于具有单例记录器)
答案 3 :(得分:0)
取决于日志记录框架。通常,您希望所有消息都转到一个日志,因此您希望所有代码都使用相同的记录器。但是记录器类不一定是单例来确保。