]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
* ircbot logging: $log_queue / logger thread
authordmitry kim <jason@nichego.net>
Tue, 15 Apr 2008 18:54:55 +0000 (22:54 +0400)
committerdmitry kim <jason@nichego.net>
Tue, 15 Apr 2008 18:54:55 +0000 (22:54 +0400)
lib/rbot/ircbot.rb

index cd073b327448f6a054889bea2869c051b8337f36..7def98b5140ebcd3c761e33d7f66fd148eca3965 100644 (file)
@@ -18,6 +18,14 @@ $logger.datetime_format = $dateformat
 $logger.level = $cl_loglevel if defined? $cl_loglevel
 $logger.level = 0 if $debug
 
+$log_queue = Queue.new
+Thread.new do
+  l = nil
+  while l = $log_queue.pop
+    $logger.add(*l)
+  end
+end
+
 require 'pp'
 
 unless Kernel.instance_methods.include?("pretty_inspect")
@@ -39,29 +47,26 @@ class Exception
 end
 
 def rawlog(level, message=nil, who_pos=1)
-  begin
-    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
-    case message
-    when String
-      str = message
-    else
-      str = message.pretty_inspect
-    end
-    str.each_line { |l|
-      $logger.add(level, l.chomp, who)
-      who.gsub!(/./," ")
-    }
-  rescue SecurityError
+  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
+  case message
+  when String
+    str = message
+  else
+    str = message.pretty_inspect
   end
+  str.each_line { |l|
+    $log_queue.push [level, l.chomp, who]
+    who = ' ' * who.size
+  }
 end
 
 def log_session_start
@@ -70,6 +75,7 @@ end
 
 def log_session_end
   $logger << "\n\n=== #{botclass} session ended on #{Time.now.strftime($dateformat)} ===\n\n"
+  $log_queue << nil
 end
 
 def debug(message=nil, who_pos=1)