在模块/类之间共享全局记录器

时间:2009-11-05 16:23:37

标签: ruby global-variables logging

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

现在我刚刚将logger创建为全局$ logger = Logger.new变量,但我觉得有一种更好的方法可以在不使用全局变量的情况下执行此操作。

如果我有以下内容:

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

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

2 个答案:

答案 0 :(得分:10)

在模块中添加一个常量:

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

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

答案 1 :(得分:1)

您可以为您的应用创建单例记录器,因此每次引用都将是同一个对象。

require 'singleton'

class Logger
  include Singleton
end

l = Logger.instance
k = Logger.instance

puts k.object_id == l.object_id #returns true