0

我遇到了一个问题,我把头撞到了墙上。基本上,我正在使用此日志记录设置来记录文件,并且效果很好!但是,我想在我构建的方法中使用它..它不会让我!它说它不是一个定义的变量。我猜这是变量范围的问题。我怎样才能解决这个问题?

这是我的日志记录设置:

class MultiDelegator
  def initialize(*targets)
    @targets = targets
  end

  def self.delegate(*methods)
    methods.each do |m|
      define_method(m) do |*args|
        @targets.map { |t| t.send(m, *args) }
      end
    end
    self
  end

  class <<self
    alias to new
  end
end

log_file = File.open("/opt/sysnovo/log/server.log", "a")
log = Logger.new MultiDelegator.delegate(:write, :close).to(STDOUT, log_file

这是我的方法(删除文件):

def cleanup
    log.info "Running cleanup"
    dirs = [ "/opt/sysnovo/tmp", "/opt/sysnovo/data", "/opt/sysnovo/merge" ]
    dirs.each do |dir|
        # Our file count.
        file_count = Dir.glob(File.join("#{dir}", '**', '*')).select { |file| File.file?(file) }.count

        # Log and delete!
        log.info "Removing #{file_count} files in #{dir}"
        FileUtils.rm_rf("#{dir}/.", secure: true)
    end
end

所以基本上,方法内部的 log.info 失败了:

./sysnovo_server.rb:58:in `<main>': undefined local variable or method `log' for main:Object (NameError)

所以我的问题是这样的:我该如何设置它才能正常工作?或者让 log.info 在我的方法中工作。或者..我做错了吗?我是Ruby的新手,所以要温柔。

4

1 回答 1

0

如果你想在你的方法中使用 log 变量,那么你应该像这样将它定义为全局变量

$log = Logger.new MultiDelegator.delegate(:write, :close).to(STDOUT, log_file)

但我建议您创建一个单例类来处理日志记录并使用它来记录。

于 2012-07-26T05:37:12.497 回答