我目前的日志设置如下:
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设计模式本身存在缺陷吗?理想情况下,我试图避免在对象没有状态时传递对象,并且它应该可用于各种类而不引入类或实例方法。想法?