【问题标题】:Share global logger among module/classes在模块/类之间共享全局记录器
【发布时间】:2010-12-13 11:55:07
【问题描述】:

在许多 ruby​​ 类之间共享记录器实例的最佳(正确)方法是什么?

现在我刚刚将记录器创建为全局 $logger = Logger.new 变量,但我觉得有一种更好的方法可以在不使用全局变量的情况下做到这一点。

如果我有以下情况:

module Foo
  class A
  class B
  class C
  ...
  class Z
end

在所有类之间共享记录器实例的最佳方式是什么?我是否以某种方式在 Foo 模块中声明/创建记录器,还是只是使用全局 $logger 正常?

【问题讨论】:

    标签: ruby global-variables logging


    【解决方案1】:

    在模块中添加一个常量:

    module Foo
      Logger = Logger.new
      class A
      class B
      class C
      ...
      class Z
    end
    

    然后你可以在你的课堂上做Logger.log('blah')。由于我们用Foo::Logger 遮蔽了全局常量Logger,这意味着如果你想在Foo 模块中引用Logger 类,你必须使用范围解析:::Logger

    【讨论】:

      【解决方案2】:

      您可以为您的应用创建一个单例 Logger,因此每个引用都指向同一个对象。

      require 'singleton'
      
      class Logger
        include Singleton
      end
      
      l = Logger.instance
      k = Logger.instance
      
      puts k.object_id == l.object_id #returns true
      

      【讨论】:

      • 请先阅读"The Chainsaw Infanticide Logger Manuever" [原文如此],然后再将 Logger 变成每个人的单例。首先将其子类化,或者(正如 Pesto 在另一个答案中建议的那样)创建一个指向您喜欢的实例的常量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2013-08-03
      • 2016-11-21
      • 2018-02-28
      • 2021-05-05
      • 2013-12-09
      相关资源
      最近更新 更多