相关疑难解决方法(0)

Ruby - 在模块/类之间共享记录器实例

处理一个小的Ruby脚本,该脚本可以访问Web并抓取各种服务.我有一个包含几个类的模块:

module Crawler
  class Runner
  class Options
  class Engine
end
Run Code Online (Sandbox Code Playgroud)

我想在所有这些类中共享一个记录器.通常我只是将它放在模块中的常量中并像这样引用它:

Crawler::LOGGER.info("Hello, world")
Run Code Online (Sandbox Code Playgroud)

问题是,在我知道输出的位置之前,我无法创建我的记录器实例.您可以通过命令行启动爬网程序,此时您可以告诉它您要在开发中运行(日志输出转到STDOUT)或生产(日志输出转到文件,crawler.log):

crawler --environment=production
Run Code Online (Sandbox Code Playgroud)

我有一个类Options解析通过命令行传入的选项.只有在那时我才知道如何使用正确的输出位置实例化记录器.

所以,我的问题是:我如何/在哪里放置我的记录器对象,以便我的所有类都可以访问它?

我可以将我的记录器实例传递给new()我创建的每个类实例的每个调用,但我知道必须有一个更好的Rubyish方法来实现它.我正在想象与模块共享的一些奇怪的类变量class << self或其他魔法.:)

更多细节:Runner通过将命令行选项传递给Options类来启动所有内容,并获取具有几个实例变量的对象:

module Crawler
  class Runner
    def initialize(argv)
      @options = Options.new(argv)
      # feels like logger initialization should go here
      # @options.log_output => STDOUT or string (log file name)
      # @options.log_level => Logger::DEBUG or Logger::INFO
      @engine = Engine.new()
    end
    def run
      @engine.go
    end
  end
end

runner = Runner.new(ARGV)
runner.run
Run Code Online (Sandbox Code Playgroud)

我需要代码Engine …

ruby logging class-design

48
推荐指数
3
解决办法
3万
查看次数

标签 统计

class-design ×1

logging ×1

ruby ×1