 <p>You can write a pseudo <code>IO</code> class that will write to multiple <code>IO</code> objects. Something like:</p> <pre><code>class MultiIO def initialize(*targets) @targets = targets end def write(*args) @targets.each {|t| t.write(*args)} end def close @targets.each(&amp;:close) end end </code></pre> <p>Then set that as your log file:</p> <pre><code>log_file = File.open("log/debug.log", "a") Logger.new MultiIO.new(STDOUT, log_file) </code></pre> <p>Every time <code>Logger</code> calls <code>puts</code> on your <code>MultiIO</code> object, it will write to both <code>STDOUT</code> and your log file.</p> <p><strong>Edit:</strong> I went ahead and figured out the rest of the interface. A log device must respond to <code>write</code> and <code>close</code> (not <code>puts</code>). As long as <code>MultiIO</code> responds to those and proxies them to the real IO objects, this should work.</p>