使用一个可以发送到Web并爬取各种服务的小Ruby脚本。我有一个内部有几个类的模块:Ruby - 在模块/类中共享记录器实例
module Crawler
class Runner
class Options
class Engine
end
我想在这些类中共享一个记录器。一般情况下我只是把这个在一个恒定的模块中引用它,像这样:
Crawler::LOGGER.info("Hello, world")
的问题是,我无法创建我的记录器实例,直到我知道那里的输出是怎么回事。你可以通过命令行启动爬行,在这一点上,你可以告诉它要在发展上运行(日志输出到stdout)或生产(日志输出为一个文件,crawler.log):
crawler --environment=production
我有一个类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
我需要的代码Engine
到能够访问记录器对象(以及在Engine
内部初始化的更多类)。帮帮我!
如果您可以动态更改已经实例化的记录器的输出位置(类似于更改日志级别),所有这些都可以避免。我将它实例化为STDOUT,然后在生产环境中转换为文件。我在某处看到了一个关于更改Ruby的$ stdout全局变量的建议,这个变量会将输出重定向到除STDOUT以外的其他位置,但这看起来很诡异。
谢谢!
谢谢查克!这正是我在结束一些测试后最终做的事情! – 2009-05-27 23:14:28