class Redwood::Logger
simple centralized logger. outputs to multiple sinks by calling << on them. also keeps a record of all messages, so that adding a new sink will send all previous messages to it by default.
Constants
- LEVELS
Public Class Methods
new(level=nil)
click to toggle source
# File lib/sup/logger.rb, line 15 def initialize level=nil level ||= ENV["SUP_LOG_LEVEL"] || "info" self.level = level @mutex = Mutex.new @buf = StringIO.new @sinks = [] end
Public Instance Methods
add_sink(s, copy_current=true)
click to toggle source
# File lib/sup/logger.rb, line 26 def add_sink s, copy_current=true @mutex.synchronize do @sinks << s s << @buf.string if copy_current end end
clear!()
click to toggle source
# File lib/sup/logger.rb, line 35 def clear!; @mutex.synchronize { @buf = StringIO.new } end
force_message(m;)
click to toggle source
send a message regardless of the current logging level
# File lib/sup/logger.rb, line 46 def force_message m; send_message format_message(nil, Time.now, m) end
level()
click to toggle source
# File lib/sup/logger.rb, line 23 def level; LEVELS[@level] end
level=(level)
click to toggle source
# File lib/sup/logger.rb, line 24 def level=(level); @level = LEVELS.index(level) || raise(ArgumentError, "invalid log level #{level.inspect}: should be one of #{LEVELS * ', '}"); end
remove_all_sinks!()
click to toggle source
# File lib/sup/logger.rb, line 34 def remove_all_sinks!; @mutex.synchronize { @sinks.clear } end
remove_sink(s;)
click to toggle source
# File lib/sup/logger.rb, line 33 def remove_sink s; @mutex.synchronize { @sinks.delete s } end
Private Instance Methods
format_message(level, time, msg)
click to toggle source
level can be nil!
# File lib/sup/logger.rb, line 51 def format_message level, time, msg prefix = case level when "warn"; "WARNING: " when "error"; "ERROR: " else "" end "[#{time.to_s}] #{prefix}#{msg.rstrip}\n" end
send_message(m)
click to toggle source
actually distribute the message
# File lib/sup/logger.rb, line 61 def send_message m @mutex.synchronize do @sinks.each do |sink| sink << m sink.flush if sink.respond_to?(:flush) and level == "debug" end @buf << m end end