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