Techioz Blog

Ruby ロガーのログをファイルだけでなく標準出力にも出力するにはどうすればよいですか?

概要

ロガーのティー機能のようなもの。

解決策

複数の IO オブジェクトに書き込む擬似 IO クラスを作成できます。何かのようなもの:

class MultiIO
  def initialize(*targets)
     @targets = targets
  end

  def write(*args)
    @targets.each {|t| t.write(*args)}
  end

  def close
    @targets.each(&:close)
  end
end

次に、それをログ ファイルとして設定します。

log_file = File.open("log/debug.log", "a")
Logger.new MultiIO.new(STDOUT, log_file)

Logger が MultiIO オブジェクトを呼び出すたびに、STDOUT とログ ファイルの両方に書き込みます。

編集: インターフェイスの残りの部分を理解しました。ログデバイスは書き込みとクローズに応答する必要があります (Put ではありません)。 MultiIO がそれらに応答し、実際の IO オブジェクトにプロキシする限り、これは機能するはずです。