如何在Ruby on Rails中临时重定向stderr?

时间:2019-06-30 22:02:23

标签: ruby-on-rails stdout yield stderr

这是我的代码(How do I temporarily redirect stderr in Ruby?的重新编译(由于本机扩展写而无法使用):

def silence_stdout(log = '/dev/null')
 orig = $stdout.dup
 $stdout.reopen(File.new(log, 'w'))
 begin
   yield
 ensure
   $stdout = orig
 end
end

silence_stdout('ttt.log') do
   #do something
end

但是我有一个问题,只有在puma停止(Ctrl + C)之后,文件中才会填充代码。 我可能应该关闭文件吗?但是我不知道该怎么做。我所有尝试关闭文件的尝试都以“日志写入失败,关闭流” “未授予任何阻止(让步)” 结束。 我寻求建议。

1 个答案:

答案 0 :(得分:0)

看起来像您想在异常之后填充文件。 您应该查看Capturing Ctrl-c in ruby并在此处应用此解决方案,例如:

 $orig_stdout = $stdout.dup
 $stdout.reopen(File.new('log', 'w'))

 trap("SIGINT") { throw :puma_exited }

catch(:puma_exited) 
   $stdout.close
   $stdout = orig
end

我没有测试它,但是看起来它正是您要寻找的