OSDN Git Service

* [shogi-server]
authorbeatles <beatles@b8c68f68-1e22-0410-b08e-880e1f8202b4>
Mon, 30 Jun 2008 15:09:47 +0000 (15:09 +0000)
committerbeatles <beatles@b8c68f68-1e22-0410-b08e-880e1f8202b4>
Mon, 30 Jun 2008 15:09:47 +0000 (15:09 +0000)
  - Added a new option --player-log-dir, which allows users to log
    messages that are received or sent to the wire.

changelog
shogi-server
shogi_server/player.rb

index 244cc29..6196aca 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+2008-06-30 Daigo Moriwaki <daigo at debian dot org>
+
+       * [shogi-server]
+         - Added a new option --player-log-dir, which allows users to log
+           messages that are received or sent to the wire.
+
 2008-06-28 Daigo Moriwaki <daigo at debian dot org>
 
        * [shogi-server]
index dd0987c..84594b5 100755 (executable)
@@ -52,6 +52,9 @@ OPTIONS
                specify filename for logging process ID
         --daemon dir
                 run as a daemon. Log files will be put in dir.
+        --player-log-dir dir
+                log network messages for each player. Log files
+                will be put in the dir.
 
 LICENSE
        GPL versoin 2 or later
@@ -88,7 +91,8 @@ def parse_command_line
   options = Hash::new
   parser = GetoptLong.new(
     ["--daemon",   GetoptLong::REQUIRED_ARGUMENT],
-    ["--pid-file", GetoptLong::REQUIRED_ARGUMENT])
+    ["--pid-file", GetoptLong::REQUIRED_ARGUMENT],
+    ["--player-log-dir", GetoptLong::REQUIRED_ARGUMENT])
   parser.quiet = true
   begin
     parser.each_option do |name, arg|
@@ -165,7 +169,7 @@ end
 def setup_logger(log_file)
   logger = Logger.new(log_file, 'daily')
   logger.formatter = ShogiServer::Formatter.new
-  logger.level = Logger::INFO  
+  logger.level = $DEBUG ? Logger::DEBUG : Logger::INFO  
   logger.datetime_format = "%Y-%m-%d %H:%M:%S"
   return logger
 end
@@ -187,6 +191,14 @@ def main
     usage
     exit 2
   end
+  if $options["player-log-dir"] && 
+     !File.exists?($options["player-log-dir"])
+    usage
+    exit 3
+  end
+  if $options["player-log-dir"]
+    $options["player-log-dir"] = File.expand_path($options["player-log-dir"])
+  end
 
   LEAGUE.event = ARGV.shift
   port = ARGV.shift
@@ -241,6 +253,7 @@ def main
 
       log_message(sprintf("user %s login", player.name))
       login.process
+      player.setup_logger($options["player-log-dir"]) if $options["player-log-dir"]
       player.run(login.csa_1st_str) # loop
       $mutex.lock
       begin
@@ -254,6 +267,7 @@ def main
         $mutex.unlock
       end
   end
+  $logger.close
 end
 
 
index b6d5404..e8aaf9f 100644 (file)
@@ -111,6 +111,7 @@ class Player < BasicPlayer
     @socket_buffer = []
     @main_thread = Thread::current
     @write_queue = Queue.new
+    @player_logger = nil
     start_write_thread
   end
 
@@ -119,6 +120,41 @@ class Player < BasicPlayer
   attr_accessor :main_thread
   attr_reader :socket_buffer
   
+  def setup_logger(dir)
+    log_file = File.join(dir, "%s.log" % [simple_player_id])
+    @player_logger = Logger.new(log_file, 'daily')
+    @player_logger.formatter = ShogiServer::Formatter.new
+    @player_logger.level = $DEBUG ? Logger::DEBUG : Logger::INFO  
+    @player_logger.datetime_format = "%Y-%m-%d %H:%M:%S"
+  end
+
+  def log(level, direction, message)
+    return unless @player_logger
+    str = message.chomp
+    case direction
+      when :in
+        str = "IN: %s" % [str]
+      when :out
+        str = "OUT: %s" % [str]
+      else
+        str = "UNKNOWN DIRECTION: %s %s" % [direction, str]
+    end
+    case level
+      when :debug
+        @player_logger.debug(str)
+      when :info
+        @player_logger.info(str)
+      when :warn
+        @player_logger.warn(str)
+      when :error
+        @player_logger.error(str)
+      else
+        @player_logger.debug("UNKNOWN LEVEL: %s %s" % [level, str])
+    end
+  rescue Exception => ex
+    log_error("#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}")
+  end
+
   def kill
     log_message(sprintf("user %s killed", @name))
     if (@game)
@@ -137,6 +173,7 @@ class Player < BasicPlayer
 #        @socket.close if (! @socket.closed?)
         write_safe(nil)
         @write_thread.join
+        @player_logger.close
       rescue
         log_message(sprintf("user %s finish failed", @name))    
       end
@@ -161,6 +198,7 @@ class Player < BasicPlayer
           end
           if r = select(nil, [@socket], nil, 20)
             r[1].first.write(str)
+            log(:info, :out, str)
           else
             log_error("Sending a message to #{@name} timed up.")
           end
@@ -198,6 +236,7 @@ class Player < BasicPlayer
   def run(csa_1st_str=nil)
     while ( csa_1st_str || 
             str = gets_safe(@socket, (@socket_buffer.empty? ? Default_Timeout : 1)) )
+      log(:info, :in, str) if str && str.instance_of?(String) 
       $mutex.lock
       begin
         if !@write_thread.alive?