+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]
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
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|
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
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
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
$mutex.unlock
end
end
+ $logger.close
end
@socket_buffer = []
@main_thread = Thread::current
@write_queue = Queue.new
+ @player_logger = nil
start_write_thread
end
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)
# @socket.close if (! @socket.closed?)
write_safe(nil)
@write_thread.join
+ @player_logger.close
rescue
log_message(sprintf("user %s finish failed", @name))
end
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
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?