Skip to content

Instantly share code, notes, and snippets.

@numericillustration
Created February 10, 2015 22:44
Show Gist options
  • Save numericillustration/5936f711c74b351096ae to your computer and use it in GitHub Desktop.
Save numericillustration/5936f711c74b351096ae to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'logger/colors'
class MultiLogger
def initialize(*targets)
@targets = targets
end
%w(debug info warn error fatal unknown).each do |m|
define_method(m) do |*args|
@targets.map { |t| t.send(m, *args) }
end
end
end
def capture_io
require 'stringio'
# clone whats there currently
orig_stdout, orig_stderr = $stdout, $stderr
# open new io objects
captured_stdout, captured_stderr = StringIO.new, StringIO.new
# reassign stdout and stderr to new io streams
$stdout, $stderr = captured_stdout, captured_stderr
# yield back to caller so that block uses redirected streams
yield
# now return the captured stdout and stderr
return captured_stdout.string, captured_stderr.string
ensure
# put that thing back where you found it or so help me
$stdout = orig_stdout
$stderr = orig_stderr
end
logpath = '/Users/mike/Documents/quick_scripts'
logfile = "#{logpath}/#{File.basename($0)}.log"
stderr_log = Logger.new(STDERR)
file_log = Logger.new(logfile)
stderr_log.level = Logger::INFO
stderr_log.formatter = proc { |severity, datetime, progname, msg|
"#{datetime} - #{severity} [#{caller[8]}] #{msg}\n"
}
file_log.level = Logger::DEBUG
file_log.formatter = proc { |severity, datetime, progname, msg|
"#{datetime} - #{severity} [#{caller[8]}] #{msg}\n"
}
$logger = MultiLogger.new( stderr_log, file_log )
$logger.debug( "#{$0} - PID #{$$} - Logger is active" )
$logger.debug( "Invoked with options:[#{$*}] - Logger is active" )
puts 'before capturing'
s_output, e_output = capture_io {
puts "stuff inside a block1"
puts "stuff inside a block2"
puts "stuff inside a block3"
puts "stuff inside a block4"
puts "stuff inside a block5"
$stderr.puts "stderr stuff inside a block1"
$stderr.puts "stderr stuff inside a block2"
$stderr.puts "stderr stuff inside a block3"
}
puts "phew, done being redirected"
$logger.debug( "Standard Output should go here #{s_output}" )
$logger.debug( "Standard error should go here #{e_output}" )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment