A Day in the Life

stdout, stderr の出力を文字列として記録する

stdout, stderr の出力を文字列として記録する

別にグローバル変数でなくても良いんだけど、STDOUT/STDERR インスタンスの匿名クラスで stringio にも記録させる。

require 'stringio'
$str_stdout_err = StringIO.new
[STDOUT, STDERR].each do |io|
  io.instance_eval { class << self ;self; end }.class_eval do
    def write(*args)
      super *args
      $str_stdout_err.write(*args) unless $str_stdout_err.closed?
    end
  end
end

at_exit {
  $str_stdout_err.rewind
  open('/tmp/output.txt', 'w') {|f| f.puts $str_stdout_err.read}
  $str_stdout_err.close
}

具体的にどんなときに役に立つのかというと、端末の出力を最後ごそっととってファイルに保存(tee 使わず純粋にRubyでやりたい)とか、どっかに送信するときとかそんなときに使える。本来は Logger なりなんなりを使うべきだけど、標準出力/エラー出力をぶんどったほうが楽でてっとり早いことも多いですよね!

記事の一覧 >

関連するかもエントリー

def color
def color出力を色づけしたいけどライブラリ使うまでもない(highline時に color メソッド定義して最近よく使うなーって思ったので貼り付けときます。String#color として定義してないのは気分のもんだい。def color(str, color = 31,...
def color出力を色づけしたいけどライブラリ使うまでもない(highline時に color メソッド定義して最近よく使うなーって思っ...
2011-06-15
Ruby で Array を継承したクラスをうまくあつかうRuby で Array を継承/Mix-inしたクラスで、自分で定義した便利なメソッドを利用したい時ってありますよね。そんなとき普通にclass MyArray < Array def odd select ...
Ruby で Array を継承したクラスをうまくあつかうRuby で Array を継承/Mix-inしたクラスで、自分で定義した便利なメ...
2010-10-27
SaSS (scss) ですべての css を打ち消す以前ちょさんが JS でやってたのの SaSS 版。ちょさんの JS コードからコピペです。http://gist.github.com/649098これを @import して、scss で.example { @inc...
SaSS (scss) ですべての css を打ち消す以前ちょさんが JS でやってたのの SaSS 版。ちょさんの JS コードからコピペ...