【问题标题】:Why we should consider the «Logger» class as a singleton?为什么我们应该将 «Logger» 类视为单例?
【发布时间】:2010-11-03 09:04:08
【问题描述】:

我们都知道日志,好吧,但我们为什么要把 «Logger» 类视为单例类呢?如果我们把它变成一个普通的 non-singleton 类会发生什么?

【问题讨论】:

    标签: design-patterns logging singleton


    【解决方案1】:

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

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

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

    这里是链接:Use your singletons wisely

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

    【讨论】:

      【解决方案2】:

      主要问题是实际日志的持久化位置。

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          取决于日志框架。通常您希望所有消息都进入一个日志,因此您希望所有代码使用同一个记录器。但是 logger-class 不必是单例来确保这一点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-13
            • 1970-01-01
            • 2013-06-07
            • 2011-04-22
            • 2011-05-16
            • 2013-07-22
            • 1970-01-01
            • 2023-04-04
            相关资源
            最近更新 更多