Difference between revisions of "Wl-domain.py"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) (New page: <pre> #! /usr/bin/env python # # Purpose: Parse and display an informix log file # # $Id:$ # #--------------------------------------------------------------------- """ Parse Weblogic wl...) |
PeterHarding (talk | contribs) |
||
Line 331: | Line 331: | ||
[[Category:Python]] | [[Category:Python]] | ||
[[Category:Log Analysis]] | [[Category:Log Analysis]] | ||
[[Category:Examples]] |
Latest revision as of 17:15, 19 July 2009
#! /usr/bin/env python # # Purpose: Parse and display an informix log file # # $Id:$ # #--------------------------------------------------------------------- """ Parse Weblogic wl-domain file and produce exception summary report """ #--------------------------------------------------------------------- import re import os import sys import time import getopt #--------------------------------------------------------------------- __version__ = "1.0.0" debugFlg = 0 stdoutFlg = 0 verboseFlg = 0 wallclockFlg = 0 rewriteFlg = 0 filename = "wl-domain.log" mode = None data = None td_start = None cnt = 0 cntExceptions = 1 cntLogLines = 0 cntAt = 0 cntBad = 0 #--------------------------------------------------------------------- stCount = {} stLevel = {} stTrace = {} stCurrent = None #--------------------------------------------------------------------- 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 newTrace(currentTrace, level, newSignature): if stTrace.has_key(newSignature): copyTrace = stTrace[newSignature] stCount[newSignature] += 1 #stCount[oldSignature] -= 1 else: copyTrace = [] for i in range(level): copyTrace.append(currentTrace[i]) copyTrace.append(newSignature) stCount[newSignature] = 1 stTrace[newSignature] = copyTrace stLevel[newSignature] = level # print str(copyTrace) return copyTrace #--------------------------------------------------------------------- def parse(filename): global cnt global cntExceptions global cntLogLines global cntAt global cntBad global stCount global stLevel global stTrace global stCurrent tmatch = re.search(r'(.*?).log', filename) if tmatch: name = tmatch.group(1) else: name = filename + ".log" filename += ".log" outfile = name + ".out" 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) t_offset = 0 inStackTrace = 0 inException = 0 stackMethod = None while 1: line = ifo.readline() if not line: break line = line[:-1] line = line.replace("\r","") re.sub(" at[^#]*#", "#", line) tmatch = re.search(r' at .*>', line) if tmatch: line = re.sub(" at .*>", "\tat BAD", line) cntBad += 1 if re.search("^$", line): continue if re.search("^\r$", line): continue cnt += 1 # print line tmatch = re.search(r'####<', line) if tmatch: tmatch = re.search(r'<([^<]*?)>.*<([^<]*?)>', line) dt = tmatch.group(1) xx = tmatch.group(2) # print "dt \"%s\" xx \"%s\"" % (dt, xx) inTrace = 1 cntLogLines += 1 if inStackTrace == 1: inStackTrace = 0 cntExceptions += 1 print stackMethod else: inTrace = 0 tmatch = re.search(r'\tat ([^ ]*\)?)', line) if tmatch: stackMethod = tmatch.group(1) # print "at \"%s\"" % method if inStackTrace != 1: print "** Start of \"%s\" [%d]" % (stackMethod, cnt) level = 0 if stCount.has_key(stackMethod): stCount[stackMethod] += 1 else: stLevel[stackMethod] = 0 stCount[stackMethod] = 1 stTrace[stackMethod] = [stackMethod,] inStackTrace = 1 stCurrent = stTrace[stackMethod] else: level += 1 if level == len(stCurrent): # Still assembling first one of this type # print "+%03d+ %s" % (level, stackMethod) stCurrent.append(stackMethod) else: # print ">%03d> %s" % (level, stackMethod) if re.search(r'BAD', stackMethod): print ">---> skipping" continue # print "Level %d stCurrent \"%s\"" % (level, len(stCurrent)) # print stCurrent[level].find(stackMethod) if stCurrent[level].find(stackMethod) != 0: # print "[%s] len1 = %d " % (stCurrent[level], len(stCurrent[level])) # print "[%s] len2 = %d " % (stackMethod, len(stackMethod)) # print "Bogus method \"%s\" at level %d" % (stackMethod, level) # print " of \"%s\"" % stCurrent[0] stCurrent = newTrace(stCurrent, level, stackMethod) # sys.exit(0) cntAt += 1 else: inStackTrace = 0 # p = line.split(' ') # print p # f_elapsed = float(p[0]) # location = p[3] # task = p[4] if None: tmatch = re.search(r'value_request_id \[Value=(.*?)\]', p[5]) if tmatch: request_id = tmatch.group(1) continue elif None: tmatch = re.search(r'item \[(.*?)\] rq \[Value=(.*?)\] awb \[Value=(.*?)\]', p[5]) if tmatch: item_no = tmatch.group(1) continue if rewriteFlg: if endFlg == 1: endFlg = 0 print >>ofo, "%s" % "xx" else: print >>ofo, "%s" % "xx" else: if (None): if None: print >>ofo, "%s" % "xx" else: print >>ofo, "%s" % "xx" ifo.close() summary(sys.stdout) summary(ofo) for method in stTrace.keys(): printTrace(ofo, stTrace[method], stLevel[method], stCount[method]) ofo.close() #--------------------------------------------------------------------- def printTrace(out, trace, level, no): print >>out print >>out, " ***** %s *****" % trace[0] print >>out, " No of calls deep %d Signature level %d No of occurences %d " % (len(trace), level, no) for i in range(len(trace)): print >>out, " %3d %s" % (i, trace[i]) #--------------------------------------------------------------------- def summary(out): print >>out, "Processed %d lines" % cnt print >>out, "Processed %d log lines" % cntLogLines print >>out, "Processed %d at lines" % cntAt print >>out, "Processed %d truncated stack traces" % cntBad print >>out, "Processed %d Exceptions" % cntExceptions print >>out, "Found %d Distinct Exceptions" % len(stCount.keys()) print >>out, "Found %d Distinct Exceptions" % len(stCount.keys()) #--------------------------------------------------------------------- def main(): global debugFlg global verboseFlg try: opts, args = getopt.getopt(sys.argv[1:], "dvVw?") except getopt.error, msg: print __doc__ return 1 for o, a in opts: if o == '-d': debugFlg = 1 elif o == '-v': verboseFlg = 1 elif o == '-V': print "Version: %s" % __version__ return 1 elif o == '-?': print __doc__ return 1 if (debugFlg): print ">> Flg %s" % debugFlg parse(filename) 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: """