How can I have ruby logger log output to stdout as well as file?

logging, ruby

Solution

You can write a pseudo `IO` class that will write to multiple `IO` objects. Something like:

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

Then set that as your log file:

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

Every time `Logger` calls `puts` on your `MultiIO` object, it will write to both `STDOUT` and your log file.

Edit: I went ahead and figured out the rest of the interface. A log device must respond to `write` and `close` (not `puts`). As long as `MultiIO` responds to those and proxies them to the real IO objects, this should work.

Problem

Someting like a tee functionality in logger.

Original source