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 = Logger.new MultiDelegator.delegate(:write, :close).to(STDOUT, log_file)

ただし、ログを処理するSingletonクラスを作成し、それを使用してログを記録することをお勧めします。

于 2012-07-26T05:37:12.497 に答える