在自定义记录器中使用单例类

时间:2015-03-26 12:45:29

标签: ruby logging singleton object-oriented-analysis

我目前的日志设置如下:

require 'active_support'
require 'singleton'
class Worker
  def initialize(logger)
    @logger = logger
  end

  def perform
    @logger.with_context(["tag1"], "Started work")
    Provider.say_hello
  end
end

class Vlogger
  include Singleton
  attr_accessor :logger

  def logger
    @logger ||= ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
  end

  def with_context(tags, msg)
    @logger.tagged(*tags) { @logger.info msg }
  end
end

class Provider
  def self.logger
    Vlogger.instance
  end

  def self.say_hello
    logger.with_context(["tag2"], "hello")
  end
end

v = Vlogger.instance
v.logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
Worker.new(v).perform

我的目标是避免传递我的Worker类中找到的@logger实例变量。理想情况下,我希望Vlogger类可供所有类使用。我发现我必须在我的代码中使用这种模式:

  def self.logger
    Vlogger.instance
  end

有更好的方法吗?我的OO设计模式本身存在缺陷吗?理想情况下,我试图避免在对象没有状态时传递对象,并且它应该可用于各种类而不引入类或实例方法。想法?

0 个答案:

没有答案