如何捕获脚本中使用'puts'生成的输出并将其保存到ruby / rails中的文件中?

时间:2011-06-21 10:41:55

标签: ruby-on-rails ruby logging

从我在rails应用程序中的脚本/目录中,我试图捕获从lib文件生成的输出,而不是在屏幕上显示它,我希望它保存到文件中。我有一个脚本,它应该在调用“puts”时显示输出到屏幕,但是在调用产生输出的方法之前,它应该设置一些东西,以便调用的函数在使用puts时应该记录到文件。我一直在试验我的rails应用程序中的以下两个文件,但它们似乎不起作用。 (正确地将stderr输出捕获到文件中,但是从简单调用“puts”产生的输出不会保存到以下代码中的文件“a.log”中:)

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require File.join(RAILS_ROOT, 'lib/mylogger.rb')

puts "logtest" # should output logtest on the screen

STDERR.puts "logtest" # should also output on the screen

x = STDOUT
y = STDERR
STDOUT = File.new("a.log", "w")
STDERR = File.new("b.log", "w")
m = MyLogger.new
m.run
STDOUT = x
STDERR = y
puts "logtest" # should log to the screen
STDERR.puts "logtest" # should log to the screen

和mylogger.rb文件如下:

class MyLogger

  def run
    1.upto 1_000_000 do |x|
      puts "mylogger #{x}" # should log to the file a.log, this does not work
      STDERR.puts "mylogger #{x}" # should log to the file b.log, this works
    end
  end
end

2 个答案:

答案 0 :(得分:3)

$stdout.reopen(File.open("a.log", "w"))

答案 1 :(得分:0)

我改变了行

STDOUT = File.new("a.log", "w")

$stdout = File.new("a.log", "w")

我改变了

STDOUT = x

$stdout = STDOUT

并且有效