如何从方法中调用我的日志记录? (变量范围)

时间:2012-07-26 02:53:24

标签: ruby

我遇到了一个问题,我撞到了墙上。基本上,我正在使用此日志记录设置来登录文件,它工作得很好!但是,我想在我建立的方法中使用它...它不会让我!它说这不是一个定义的变量。我猜这是变量范围的问题。我该如何解决这个问题?

这是我的日志记录设置:

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 INSIDE失败了:

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

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

1 个答案:

答案 0 :(得分:0)

如果要在方法中使用日志变量,则应将其定义为全局变量,如此

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

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