Каков наилучший способ дублировать стандарт из процесса и в стандарт, и в файл? - PullRequest
0 голосов
/ 13 мая 2011

Когда я делаю $stdout.puts "foo", я хочу, чтобы он шел как в стандартный вывод, так и в файл.

Я придумал:

def log_init
  $stdout.sync = true
  old_out = $stdout.dup
  old_out.sync = true
  r, w = IO.pipe
  $stdout.reopen(w)
  fork do
    f = File.open('/tmp/test', 'a') do |f|
      f.sync = true
      while (sel = IO.select([r], [], [], 1000))
        readfds, *rest = sel
        data = readfds.first.readpartial(1024)
        old_out.write(data)
        f.write(data)
      end
    end
  end
end

Можете ли вы сделать это, не требуявторой процесс?

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Просто сделайте это из оболочки:

   your-program | tee file
0 голосов
/ 13 мая 2011

Я думаю, что этот пост / ветка из списка рассылки Ruby может помочь вам: http://www.ruby -forum.com / topic / 102759 # 226506

В частности, этот фрагмент кода:

["$stdout", "$stderr"].each do |std|
  io           = eval(std)
  old_write    = io.method(:write)

  class << io
    self
  end.module_eval do
    define_method(:write) do |text|
      unless text =~ /^[\r\n]+$/       # Because puts calls twice.
        File.open("logfile.log", "a") do |f|
          f.puts [std[1..-1].upcase, caller[2], text].join(" ")
        end
      end

      old_write.call(text)
    end
  end
end

$stdout.puts "text on stdout"
$stderr.puts "text on stderr"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...