Prune log.py
Jump to navigation
Jump to search
#! /usr/bin/env python # # Purpose: Parse and display an informix log file # # $Id:$ # #--------------------------------------------------------------------- """ Parse Ben Lee's LR log files to show the underlying function invocation sequence in the designated log file. Another option shows timing of start of function. Instructions for use: 1. You should change to the loadgen directory - the one containing the log files generated by Ben's code. 2. Run: $ prune_log.py -t *.log This produces a logs.sorted file contining the merged and sorted rewritten logs. 3. Then run: $ time_line.py This produces 'time_line.txt' which contains the time line and concurrency map. """ #--------------------------------------------------------------------- import re import os import sys import glob import time import getopt import pickle #--------------------------------------------------------------------- __version__ = "1.2.2" debugFlg = 0 stdoutFlg = 0 verboseFlg = 0 wallclockFlg = 0 rewriteFlg = 0 directoryFlg = None filename = "Backline_0068.log" mode = None data = None t_start = None td_start = None vuser = "068" node_map = {} #--------------------------------------------------------------------- addresses = {} user_threads = {} locks = {} transactions = {} #--------------------------------------------------------------------- class Lock: address = None wtlist = None owner = None lklist = None type = None tblsnum = None rowid = None key_no = None bsize = None def __init__(self, p): print "XXXX", p self.address = p[0] self.wtlist = p[1] self.owner = p[2] self.lklist = p[3] self.type = p[4] self.tblsnum = p[5] self.rowid = p[6] self.key_no = p[7] self.bsize = p[8] def Check(self, p): pass #--------------------------------------------------------------------- def startSeconds(s): return time.mktime(time.strptime(s, "%Y-%m-%d %H:%M:%S")) #--------------------------------------------------------------------- def seconds(hms): s = hms.split(':') return ((s[0] * 60) + s[1]) * 60 + s[2] #--------------------------------------------------------------------- def hms(t_secs): hm = t_secs / 60 hours = hm / 60 mins = hm % 60 secs = t_secs % 60 return "%02d:%02d:%02d" % ( hours, mins, secs) #--------------------------------------------------------------------- def parse(filename): global t_start print filename tmatch = re.search(r'(.*?).log', filename) if tmatch: name = tmatch.group(1) else: name = filename + ".log" filename += ".log" if rewriteFlg: outfile = name + ".out" else: outfile = name + ".seq" tmatch = re.search(r'line_(.*?).log', filename) if tmatch: vuser_id = int(tmatch.group(1)) else: vuser_id = 0 vuser = "%03d" % vuser_id try: ifo = open(filename, 'r') except IOError, msg: sys.stderr.write(filename + ': cannot open: ' + `msg` + '\n') sys.exit(1) if stdoutFlg == 1: ofo = sys.stdout else: try: ofo = open(outfile, 'w') except IOError, msg: sys.stderr.write(outfile + ': cannot open: ' + `msg` + '\n') sys.exit(1) cnt = 0 username = "*UNDEF*" current_task = None end_iteration = 0 t_offset = None endFlg = 0 obj = "-" while 1: line = ifo.readline() if not line: break line = line[:-1] line = line.replace("\r","") if re.search("^[^0-9]", line): continue if re.search("^#", line): continue if re.search("^$", line): continue if re.search("^\r$", line): continue if re.search("initial due date time", line): continue if re.search("username", line): tmatch = re.search(r'host \[(.*?):7001\] username \[(.*?)\]', line) if tmatch: node = tmatch.group(1) username = tmatch.group(2) print "Username = \"%s\"" % username print "Node = \"%s\" (vuser %s)" % (node, vuser) node_map[vuser] = node continue if not t_offset: if re.search("Timestamp", line): tmatch = re.search(r'Timestamp \((.*?)\)', line) if tmatch: t_timestamp = int(tmatch.group(1)) print "Timestamp = \"%d\"" % t_timestamp if t_start: t_offset = t_timestamp - t_start else: t_start = t_timestamp print "Setting t_start = \"%d\"" % t_start t_offset = 0 print "Delta = \"%d\"" % t_offset continue sys.exit(0) continue cnt += 1 if re.search("TxEnd", line): endFlg = 1 p = line.split(' ', 5) # print p f_elapsed = float(p[0]) t_elapsed = int(f_elapsed) + t_offset if wallclockFlg == 1: t_wallclock = ' '.join((p[1], p[2])) else: t_wallclock = '' location = p[3] task = p[4] if task == "BL_RequestSearch": tmatch = re.search(r'value_request_id \[Value=(.*?)\]', p[5]) if tmatch: request_id = tmatch.group(1) obj = request_id continue elif task == "BL_HomeRequestQueueWait": tmatch = re.search(r'item \[(.*?)\] rq \[Value=(.*?)\] awb \[Value=(.*?)\]', p[5]) if tmatch: item_no = tmatch.group(1) request_id = tmatch.group(2) awb_number = tmatch.group(3) obj = "%s:%s" % (awb_number, request_id) continue elif task == "BL_ActivityNew_No_Queue": tmatch = re.search(r'new_activity_id \[(.*?)\]', p[5]) if tmatch: activity_id = tmatch.group(1) obj = activity_id continue elif task == "BL_ActivityEventCreate_No_Queue": tmatch = re.search(r'item \[(.*?)\] match \[(.*?)\] value_task \[Value=(.*?)\]', p[5]) if tmatch: item_no = tmatch.group(1) activity_id = tmatch.group(2) value_task = tmatch.group(3) obj = activity_id continue tmatch = re.search(r'added to awb \[(.*?)\] value_activity_event \[Value=(.*?)\]', p[5]) if tmatch: awb_number = tmatch.group(1) event = tmatch.group(2) continue tmatch = re.search(r'Total Activities rows displayed \[(.*?)\]', p[5]) if tmatch: no_act = tmatch.group(1) continue tmatch = re.search(r'Total OpenActivities rows displayed \[(.*?)\]', p[5]) if tmatch: no_open_act = tmatch.group(1) continue # added to awb [4288432503] request type [Value=task.event.arrangedPickupRecollection] elif task == "BL_RequestEventCreate_No_Queue": tmatch = re.search(r'added to awb \[(.*?)\] request type \[Value=(.*?)\]', p[5]) if tmatch: awb_number = tmatch.group(1) req_type = tmatch.group(2) obj = awb_number continue # new_sub_activity_id elif task == "BL_SubActivityNew_No_Queue": tmatch = re.search(r'item \[(.*?)\] match \[(.*?)\] value_task \[Value=(.*?)\]', p[5]) if tmatch: item_no = tmatch.group(1) activity_id = tmatch.group(2) value_task = tmatch.group(3) continue tmatch = re.search(r'added to awb \[(.*?)\] value_activity_event \[Value=(.*?)\]', p[5]) if tmatch: awb_number = tmatch.group(1) event = tmatch.group(2) continue tmatch = re.search(r'Total Activities rows displayed \[(.*?)\]', p[5]) if tmatch: no_act = tmatch.group(1) continue tmatch = re.search(r'Total OpenActivities rows displayed \[(.*?)\]', p[5]) if tmatch: no_open_act = tmatch.group(1) continue tmatch = re.search(r'new_sub_activity_id \[(.*?)\]', p[5]) if tmatch: sub_act_id = tmatch.group(1) obj = sub_act_id continue elif task == "BL_ActivityClose_No_Queue": tmatch = re.search(r'item \[(.*?)\] match \[(.*?)\] value_task \[Value=(.*?)\]', p[5]) if tmatch: item_no = tmatch.group(1) activity_id = tmatch.group(2) value_task = tmatch.group(3) obj = activity_id continue tmatch = re.search(r'Total Activities rows displayed \[(.*?)\]', p[5]) if tmatch: no_act = tmatch.group(1) continue tmatch = re.search(r'Total OpenActivities rows displayed \[(.*?)\]', p[5]) if tmatch: no_open_act = tmatch.group(1) continue elif task == "FL_AWBSearch": tmatch = re.search(r'FL_AWBSearch_AdvancedSearch_NextStep', p[5]) if tmatch: awb_number = "-" obj = awb_number tmatch = re.search(r'AWB \[(.*?)\]', p[5]) if tmatch: awb_number = tmatch.group(1) obj = awb_number # print "AWB [%s]" % awb_number # continue # FL_RequestCreate added to awb [4363566152] confirm / new_request_id [242991] elif task == "FL_RequestCreate": tmatch = re.search(r'added to awb \[(.*?)\] confirm \/ new_request_id \[(.*?)\]', p[5]) if tmatch: awb_number = tmatch.group(1) request_id = tmatch.group(2) obj = awb_number if rewriteFlg: if endFlg == 1: endFlg = 0 try: print >>ofo, "%s %s %s %s %s %s %s [%s] [%s]" % (hms(t_elapsed), p[1], p[2], vuser, p[3], p[4], p[5], username, obj) except: print "%s" % line sys.exit(0) else: print >>ofo, "%s %s %s %s %s %s %s" % (hms(t_elapsed), p[1], p[2], vuser, p[3], p[4], p[5]) else: if ((task != current_task) or (re.search(r'global_current_action_name \[', p[5]))): if current_task == "BL_RequestSearch": print >>ofo, "%s%s %s %-32s RequestID %s" % (hms(t_elapsed), t_wallclock, vuser, current_task, request_id) elif current_task == "BL_HomeRequestQueueWait": print >>ofo, "%s%s %s %-32s RequestID %s AWB %s [%s]" % (hms(t_elapsed), t_wallclock, vuser, current_task, request_id, awb_number, item_no) elif current_task == "BL_ActivityNew_No_Queue": print >>ofo, "%s%s %s %-32s ActivityID %s" % (hms(t_elapsed), t_wallclock, vuser, current_task, activity_id) elif current_task == "BL_ActivityEventCreate_No_Queue": print >>ofo, "%s%s %s %-32s ActivityID %s AWB %s [%s:%s/%s]" % (hms(t_elapsed), t_wallclock, vuser, current_task, activity_id, awb_number, item_no, no_open_act, no_act) elif current_task == "BL_RequestEventCreate_No_Queue": print >>ofo, "%s%s %s %-32s AWB %s RequestType [%s]" % (hms(t_elapsed), t_wallclock, vuser, current_task, awb_number, req_type) elif current_task == "BL_SubActivityNew_No_Queue": print >>ofo, "%s%s %s %-32s ActivityID %s AWB %s [%s:%s/%s] SubActivityID %s" % (hms(t_elapsed), t_wallclock, vuser, current_task, activity_id, awb_number, item_no, no_open_act, no_act, sub_act_id) elif current_task == "BL_ActivityClose_No_Queue": print >>ofo, "%s%s %s %-32s ActivityID %s [%s:%s/%s]" % (hms(t_elapsed), t_wallclock, vuser, current_task, activity_id, item_no, no_open_act, no_act) elif current_task == "BL_RequestClose_No_Queue": print >>ofo, "%s%s %s %-32s RequestID %s" % (hms(t_elapsed), t_wallclock, vuser, current_task, request_id) elif current_task == "FL_AWBSearch": print >>ofo, "%s%s %s %-32s AWB %s" % (hms(t_elapsed), t_wallclock, vuser, current_task, awb_number) elif current_task == "FL_RequestCreate": print >>ofo, "%s%s %s %-32s AWB %s RequestID %s" % (hms(t_elapsed), t_wallclock, vuser, current_task, awb_number, request_id) else: print >>ofo, "%s%s %s %-32s" % (hms(t_elapsed), t_wallclock, vuser, current_task) if current_task and current_task.find("EndIteration") != -1: print >>ofo, " -------------------------" current_task = task ifo.close() ofo.close() print >>sys.stderr, "Processed %d lines" % cnt #--------------------------------------------------------------------- def main(): global filename global td_start global t_start global debugFlg global directoryFlg global stdoutFlg global verboseFlg global rewriteFlg global wallclockFlg try: opts, args = getopt.getopt(sys.argv[1:], "dDf:ors:tvVw?") except getopt.error, msg: print __doc__ return 1 for o, a in opts: if o == '-d': debugFlg = 1 elif o == '-D': directoryFlg = 1 elif o == '-f': filename = a elif o == '-o': stdoutFlg = 1 elif o == '-s': td_start = a elif o == '-v': verboseFlg = 1 elif o == '-V': print "Version: %s" % __version__ return 1 elif o == '-r': rewriteFlg = 1 elif o == '-t': rewriteFlg = 1 wallclockFlg = 1 elif o == '-w': wallclockFlg = 1 elif o == '-?': print __doc__ return 1 if (debugFlg): print ">> Flg %s" % debugFlg if td_start: t_start = startSeconds(td_start) print "Start = %d" % t_start else: t_start = None if directoryFlg: files = glob.glob("*.log") for file in files: parse(file) elif args: for arg in args: parse(arg) else: parse(filename) if rewriteFlg: print "Concatenating rewritten output files" os.system('cat *.out > logs.rewriten') print "Sorting rewritten logs" os.system('sort logs.rewriten > logs.sorted') os.system('rm -f logs.rewriten') # Pickle the vuser/node mapping print str(node_map) f = open('node_map.dump', 'w') pickle.dump(node_map, f) f.close() return 1 #--------------------------------------------------------------------- if __name__ == '__main__' or __name__ == sys.argv[0]: sys.exit(main()) #--------------------------------------------------------------------- """ Revision History: Date Who Description -------- --- -------------------------------------------------- 20040603 plh Initial implementation Problems to fix: To Do: Issues: """ """ 0000.0 [2004-06-11 20:55:34] ../lib/Utils.c:775 BL_Login Timestamp (1086951334) - Fri Jun 11 20:55:34 2004 0000.0 [2004-06-11 20:55:34] ../lib/Login.c:42 BL_Login Login - (VUser Backline:68) 0000.0 [2004-06-11 20:55:34] ../lib/Login.c:45 BL_Login host [node1.perf:7001] username [BbMELGTW] password [BbMELGTW] 0000.0 [2004-06-11 20:55:34] ../lib/Utils.c:1179 BL_Login start transaction [BL_Login_Home] 0002.0 [2004-06-11 20:55:36] ../lib/Utils.c:1101 BL_Login end transaction [BL_Login_Home] 0002.0 [2004-06-11 20:55:36] ../lib/Utils.c:1107 BL_Login transaction duration [BL_Login_Home] [2.273965] 0014.0 [2004-06-11 20:55:48] ../lib/Utils.c:1179 BL_Login start transaction [BL_Login_Redirect] 0016.0 [2004-06-11 20:55:50] ../lib/Utils.c:1101 BL_Login end transaction [BL_Login_Redirect] 0016.0 [2004-06-11 20:55:50] ../lib/Utils.c:1107 BL_Login transaction duration [BL_Login_Redirect] [0.218618] 0024.0 [2004-06-11 20:55:58] ../lib/Utils.c:1194 BL_Login start transaction [BL_Login_NotificationInitFrame] 0026.0 [2004-06-11 20:56:00] ../lib/Utils.c:1101 BL_Login end transaction [BL_Login_NotificationInitFrame] 0026.0 [2004-06-11 20:56:00] ../lib/Utils.c:1107 BL_Login transaction duration [BL_Login_NotificationInitFrame] [0.003013] 0037.0 [2004-06-11 20:56:11] ../lib/Utils.c:1179 BL_Login start transaction [BL_Login_Send] 0039.0 [2004-06-11 20:56:13] ../lib/Utils.c:1101 BL_Login end transaction [BL_Login_Send] 0039.0 [2004-06-11 20:56:13] ../lib/Utils.c:1107 BL_Login transaction duration [BL_Login_Send] [1.581912] 0047.0 [2004-06-11 20:56:21] ../lib/NotificationInit.c:6 BL_NotificationInit global_current_action_name [NotificationInit] 0047.0 [2004-06-11 20:56:21] ../lib/Utils.c:1588 BL_NotificationInit BL_NotificationInit 0047.0 [2004-06-11 20:56:21] ../lib/Utils.c:1194 BL_NotificationInit start transaction [BL_NotificationInit_InitFrame] 0049.0 [2004-06-11 20:56:23] ../lib/Utils.c:1101 BL_NotificationInit end transaction [BL_NotificationInit_InitFrame] 0049.0 [2004-06-11 20:56:23] ../lib/Utils.c:1107 BL_NotificationInit transaction duration [BL_NotificationInit_InitFrame] [0.061407] 0060.0 [2004-06-11 20:56:34] ../lib/StartIteration.c:5 BL_StartIteration global_current_action_name [StartIteration] 0060.0 [2004-06-11 20:56:34] ../lib/Utils.c:1588 BL_StartIteration BL_StartIteration 0060.0 [2004-06-11 20:56:34] ../lib/StartIteration.c:8 BL_StartIteration start user data point [BL_IterationTransaction] 0060.0 [2004-06-11 20:56:34] ../lib/NotificationRender.c:12 BL_NotificationRender global_current_action_name [NotificationRender] 0060.0 [2004-06-11 20:56:34] ../lib/Utils.c:1588 BL_NotificationRender BL_NotificationRender 0060.0 [2004-06-11 20:56:34] ../lib/NotificationRender.c:18 BL_NotificationRender notification_interval [13.000000]. 0060.0 [2004-06-11 20:56:34] BL_HomeRequestQueueWait.c:15 BL_HomeRequestQueueWait global_current_action_name [HomeRequestQueueWait] 0060.0 [2004-06-11 20:56:34] ../lib/Utils.c:1588 BL_HomeRequestQueueWait BL_HomeRequestQueueWait 0060.0 [2004-06-11 20:56:34] ../lib/Utils.c:1179 BL_HomeRequestQueueWait start transaction [BL_HomeRequestQueueWait_Home] """