17 def enable_console_logger
18 @console_logger = Logger.new(STDERR)
19 @console_logger.datetime_format = @dateformat
20 @console_logger.level = Logger::Severity::DEBUG
23 def disable_console_logger
28 @dateformat = "%Y/%m/%d %H:%M:%S"
38 def set_logfile(filename, keep, max_size)
39 # close previous file logger if present
40 @file_logger.close if @file_logger
42 @file_logger = Logger.new(filename, keep, max_size*1024*1024)
43 @file_logger.datetime_format = @dateformat
44 @file_logger.level = @console_logger.level
46 # make sure the thread is running, which might be false after a fork
47 # (conveniently, we call set_logfile right after the fork)
52 @console_logger.level = level if @console_logger
53 @file_logger.level = level if @file_logger
56 def sync_log(severity, message = nil, progname = nil)
57 @console_logger.add(severity, message, progname) if @console_logger
58 @file_logger.add(severity, message, progname) if @file_logger
61 def async_log(severity, message=nil, who_pos=1)
63 STDERR.puts('logger thread already destroyed, cannot log message!')
67 if call_stack.length > who_pos
68 who = call_stack[who_pos].sub(%r{(?:.+)/([^/]+):(\d+)(:in .*)?}) { "#{$1}:#{$2}#{$3}" }
72 # Output each line. To distinguish between separate messages and multi-line
73 # messages originating at the same time, we blank #{who} after the first message
75 # Also, we output strings as-is but for other objects we use pretty_inspect
76 message = message.kind_of?(String) ? message : (message.pretty_inspect rescue '?')
78 message.each_line { |l|
79 qmsg.push [severity, l.chomp, who]
86 # if we forked, the thread may be dead, so let's restart it if necessary
89 @file_logger << "\n\n=== session started on #{Time.now.strftime(@dateformat)} ===\n\n"
95 @file_logger << "\n\n=== session ended on #{Time.now.strftime(@dateformat)} ===\n\n"
100 if @thread and @thread.alive?
109 while @queue.size > 0
117 return if @thread and @thread.alive?
118 @thread = Thread.new do
120 while lines = @queue.pop
133 def debug(message=nil, who_pos=1)
134 Irc::Bot::LoggerManager.instance.async_log(Logger::Severity::DEBUG, message, who_pos)
137 def log(message=nil, who_pos=1)
138 Irc::Bot::LoggerManager.instance.async_log(Logger::Severity::INFO, message, who_pos)
141 def warning(message=nil, who_pos=1)
142 Irc::Bot::LoggerManager.instance.async_log(Logger::Severity::WARN, message, who_pos)
145 def error(message=nil, who_pos=1)
146 Irc::Bot::LoggerManager.instance.async_log(Logger::Severity::ERROR, message, who_pos)
149 def fatal(message=nil, who_pos=1)
150 Irc::Bot::LoggerManager.instance.async_log(Logger::Severity::FATAL, message, who_pos)