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

问题描述 投票:0回答:5

我们都知道日志,但是为什么我们应该将“Logger”类视为单例类呢?如果我们将其作为普通的单例类,会发生什么?

design-patterns logging singleton
5个回答
14
投票

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

真正的单身人士的经典例子 是一个日志服务。假设我们有 基于事件的日志服务:客户端 对象请求记录文本 发送消息到日志记录 服务。其他对象实际记录 某处的文本(控制台、文件、 无论如何)通过听日志记录 这些日志记录请求的服务和 处理它们。首先,请注意 日志服务传递经典 测试是否是单身:

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

这里是链接:明智地使用你的单身人士

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


4
投票

主要问题是实际日志保存在哪里。

如果您在文件系统上进行写入,则拥有多个实例(因此可能有多个线程)可能会导致文件出现乱码。

从某种意义上说,根据缓冲和其他低级机制,来自一次写入的消息最终可能会与来自其他写入的消息(或部分消息)混合。

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


2
投票

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

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


0
投票

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


0
投票

我相信我们也可以用完文件描述符

© www.soinside.com 2019 - 2024. All rights reserved.