diff --git a/xwords4/scripts/log-parse.py b/xwords4/scripts/log-parse.py index e6d067e8e..579bd98d8 100755 --- a/xwords4/scripts/log-parse.py +++ b/xwords4/scripts/log-parse.py @@ -1,33 +1,103 @@ #!/usr/bin/python -import sys, re +import sys, re, datetime +from datetime import date +def CONNNAME_ASSIGN(thread, timestamp, mtch): + global g_games + connname = mtch.group(2) + if not connname in g_games: + game = {'connname': connname, + 'cids' : set(), + 'ts': timestamp + } + g_games[connname] = game + game = g_games[connname] + game['cids'].add( mtch.group(1) ) + + +def CID(thread, timestamp, mtch): + print "CID called with", mtch.group(0) + +# Global full-line patterns LINE = re.compile('(<0x.*>)(\d\d:\d\d:\d\d): (.*)$') -DATE = re.compile('It\'s a new day: \d\d/\d\d/\d\d\d\d') -nMatches = 0 -nDates = 0 +DATE = re.compile('It\'s a new day: (\d\d/\d\d/\d\d\d\d)') + +# Patterns for the meat of log lines, after thread and timestamp +g_patterns = { + 'CID' : [ re.compile('^cid:(\d*)\((.*):([0-9a-f]*):(\d)\) .*$'), CID ], + 'CONNNAME_ASSIGN': [re.compile('^(cid:\d*)\(.* assignConnName: assigning name: (.*)$'), + CONNNAME_ASSIGN], + 'UDP_READ': [re.compile('read_udp_packet: recvfrom=>(\d*)$')], + 'REFRESH_RESETTING': [re.compile( '^Refresh: RESETTING.*$' )], + 'HANDLE_ENQUEUING': [re.compile( '^handle: enqueuing packet \d* \(socket (\d*), len (\d*)\)$' )], + 'PACKED_DISPATCH': [re.compile( '^thread_main: dispatching packet (\d*) \(socket (\d)\); (\d*) seconds old$' )], + 'HANDLE_UDP_PACKET': [re.compile( '^handle_udp_packet\(msg=(.*)\)$' )], + 'REMEMBERDEVICE': [re.compile( '^rememberDevice\(devid=(.*), saddr=\'.*\'\)')], + 'REMEMBERDEVICE_REPL': [re.compile( '^rememberDevice: replacing address for .*$' )], + 'MAP_CONTAINS': [re.compile( '^dev->addr map now contains \d* entries' )], + 'RETRIEVEMESSAGES': [re.compile( '^retrieveMessages\(\)$' )], + 'ACKPACKETIF': [re.compile( '^ackPacketIf: acking packet \d*$' )], + 'SEND_VIA_UDP_IMPL': [re.compile( '^send_via_udp_impl\(\)=>\d*$' )], + 'REFRESH_ADDING' : [re.compile( '^Refresh: adding \'(.*)\'$' )], + 'REFRESH_REFRESHING' : [re.compile( '^Refresh: refreshing \'(.*)\'; last seen \d* milliseconds ago$' )], + 'PROCESSMESSAGE' : [re.compile( '^processMessage got (.*)$' )], + 'PROCESSRECONNECT' : [re.compile( '^processReconnect\(\)$' )], + 'QUERY' : [re.compile( '^query: .*$' )], + 'ADDTOGAME_QUERY' : [re.compile( '^[a-zA-Z]*: query: .*$' )], + 'FINDGAMEFOR' : [re.compile( '^FindGameFor\((.*)\)=>1$' )], + 'SETOWNER' : [re.compile( '^SetOwner\(owner=(\d*)\); m_ownerCount now (\d*)$' )], + 'HOSTREC_CREATED' : [re.compile( '^HostRec created HostRec with id \d$' ) ], + 'SEND_MSG_VIA_UDP': [re.compile( '^send_msg_via_udp: sent \d* bytes \(plus header\) on UDP socket, token=.*\(\d*\)$')], + 'SEND_MSG_VIA_UDP_DONE': [re.compile( '^send_msg_via_udp\(\)=>\d*$' )], + 'HANDLE_UDP_PACKET_ACK' : [re.compile( '^handle_udp_packet: got ack for packet (\d*)$' )], + 'CALLPROC' : [re.compile( '^callProc\(.*\)$' )], + 'ONMSGACKED' : [re.compile( '^onMsgAcked\(packetID=\d*, acked=true\)$')], + 'RECYCLE_LOCKED_LOCKING' : [re.compile( '^Recycle_locked\(cref=0x.*,cookie=(.*)\)$')], + + 'RECYCLE_LOCKED_ERASING' : [re.compile( 'Recycle_locked: erasing cref cid (\d*)')], +} + + +# indexed by connname. +g_games = {} def handleLine(thread, timestamp, rest): - global nMatches - nMatches += 1 - print "handleLine got", thread, "and", timestamp, "and", rest + global g_games, g_curDate, g_patterns + mtch = None + for RE in g_patterns.keys(): + mtch = g_patterns[RE][0].match( rest ) + if mtch: + if 1 < len(g_patterns[RE]): + g_patterns[RE][1](thread, timestamp, mtch) + break + + if not mtch: + print "No match for:", rest + sys.exit(0) def main(): - global nMatches, nDates - + global g_curDate, g_games + g_curDate = None + for line in sys.stdin: line.strip() mtch = LINE.match(line) if mtch: - handleLine( mtch.group(1), mtch.group(2), mtch.group(3) ) - break + ts = datetime.datetime.strptime(mtch.group(2), '%H:%M:%S') + if g_curDate: + ts = datetime.datetime.combine( g_curDate, ts.time() ) + handleLine( mtch.group(1), ts, mtch.group(3) ) + continue mtch = DATE.match(line) if mtch: - nDates += 1 + g_curDate = datetime.datetime.strptime(mtch.group(1), '%d/%m/%Y').date() continue print "unmatched: ", line break - print "got", nMatches, "normal lines and", nDates, "dates." + print 'here' + for conname in g_games.keys(): + print conname, g_games[conname]['ts'] main()