class Irc::Bot::LoggerManager
Public Class Methods
new()
click to toggle source
# File lib/rbot/logger.rb, line 27 def initialize @dateformat = "%Y/%m/%d %H:%M:%S" enable_console_logger @file_logger = nil @queue = Queue.new start_thread end
Public Instance Methods
async_log(severity, message=nil, who_pos=1)
click to toggle source
# File lib/rbot/logger.rb, line 61 def async_log(severity, message=nil, who_pos=1) unless @thread STDERR.puts('logger thread already destroyed, cannot log message!') end call_stack = caller if call_stack.length > who_pos who = call_stack[who_pos].sub(%r{(?:.+)/([^/]+):(\d+)(:in .*)?}) { "#{$1}:#{$2}#{$3}" } else who = "(unknown)" end # Output each line. To distinguish between separate messages and multi-line # messages originating at the same time, we blank #{who} after the first message # is output. # Also, we output strings as-is but for other objects we use pretty_inspect message = message.kind_of?(String) ? message : (message.pretty_inspect rescue '?') qmsg = Array.new message.each_line { |l| qmsg.push [severity, l.chomp, who] who = ' ' * who.size } @queue.push qmsg end
disable_console_logger()
click to toggle source
# File lib/rbot/logger.rb, line 23 def disable_console_logger @console_logger = nil end
enable_console_logger()
click to toggle source
# File lib/rbot/logger.rb, line 17 def enable_console_logger @console_logger = Logger.new(STDERR) @console_logger.datetime_format = @dateformat @console_logger.level = Logger::Severity::DEBUG end
flush()
click to toggle source
# File lib/rbot/logger.rb, line 108 def flush while @queue.size > 0 next end end
halt_logger()
click to toggle source
# File lib/rbot/logger.rb, line 99 def halt_logger if @thread and @thread.alive? @queue << nil @thread.join @thread = nil log_session_end end end
log_session_end()
click to toggle source
# File lib/rbot/logger.rb, line 93 def log_session_end if @file_logger @file_logger << "\n\n=== session ended on #{Time.now.strftime(@dateformat)} ===\n\n" end end
log_session_start()
click to toggle source
# File lib/rbot/logger.rb, line 85 def log_session_start # if we forked, the thread may be dead, so let's restart it if necessary start_thread if @file_logger @file_logger << "\n\n=== session started on #{Time.now.strftime(@dateformat)} ===\n\n" end end
set_level(level)
click to toggle source
# File lib/rbot/logger.rb, line 51 def set_level(level) @console_logger.level = level if @console_logger @file_logger.level = level if @file_logger end
set_logfile(filename, keep, max_size)
click to toggle source
# File lib/rbot/logger.rb, line 38 def set_logfile(filename, keep, max_size) # close previous file logger if present @file_logger.close if @file_logger @file_logger = Logger.new(filename, keep, max_size*1024*1024) @file_logger.datetime_format = @dateformat @file_logger.level = @console_logger.level # make sure the thread is running, which might be false after a fork # (conveniently, we call set_logfile right after the fork) start_thread end
sync_log(severity, message = nil, progname = nil)
click to toggle source
# File lib/rbot/logger.rb, line 56 def sync_log(severity, message = nil, progname = nil) @console_logger.add(severity, message, progname) if @console_logger @file_logger.add(severity, message, progname) if @file_logger end
Private Instance Methods
start_thread()
click to toggle source
# File lib/rbot/logger.rb, line 116 def start_thread return if @thread and @thread.alive? @thread = Thread.new do lines = nil while lines = @queue.pop lines.each { |line| sync_log(*line) } end end end