def get_jsonlog(filename='log/airtest.log'): logfile = os.getenv('AIRTEST_LOGFILE', filename) if os.path.exists(logfile): backfile = logfile+'.'+time.strftime('%Y%m%d%H%M%S') os.rename(logfile, backfile) else: base.makedirs(base.dirname(logfile)) jlog = jsonlog.JSONLog(logfile) return jlog
def writeline(self, d, *args): ''' @param d (dict or string): content needed write to file @param args(array): only when d is string, support writeline('hello %s', 'world') ''' with Lock(self._lock) as _: base.makedirs(base.dirname(self._filename)) with open(self._filename, 'a') as file: if isinstance(d, dict): d.update({'timestamp': int(time.time())}) outline = json.dumps(d) else: outline = str(d) % args file.write(outline.rstrip() + '\n')
def render(logfile, htmldir): ''' parse logfile and render it to html ''' if not os.path.exists(logfile): sys.exit('logfile: %s not exists' %(logfile)) #htmldir = base.dirname(htmlfile) if not os.path.exists(htmldir): os.makedirs(htmldir) cpus, items = [], [] fpss = [] mems, imgs = [], [] data = { 'info': { 'generated_time': time.strftime('%Y/%m/%d %H:%M:%S'), }, 'items': items, #'cpus': cpus, 'cpu_data': None, 'mem_data': None, #'mems': mems, 'images': imgs, } info = data.get('info') start_time = 0 for line in open(logfile): d = json.loads(line) time_format = '%Y/%m/%d %H:%M:%S' timestamp = d.get('timestamp') - start_time _type = d.get('type') if _type == 'start': start_time = d.get('timestamp') elif _type == 'record': mem = d.get('mem') if mem: mems.append([timestamp, mem]) cpu = d.get('cpu') if cpu: cpus.append([timestamp, cpu]) fps = d.get('fps') if fps: fpss.append([timestamp, fps]) elif _type == 'snapshot': filename = d.get('filename') basename = os.path.basename(filename) with fuckit: shutil.copyfile(filename, os.path.join(htmldir, basename)) imgs.append({'time':timestamp, 'filename':basename}) #elif d.get('result'): # data['result'] = {'status': d.get('result'), 'detail': d.get('detail')} data['cpu_data'] = json.dumps(cpus) data['mem_data'] = json.dumps(mems) def average(ss): if ss: return reduce(lambda x,y: x+y, [value for _,value in ss])/float(len(ss)) return 0.0 data['cpu_average'] = round(average(cpus), 2) data['mem_average'] = round(average(mems), 2) data['fps_average'] = round(average(fpss), 2) tmpldir = os.path.join(base.dirname(__file__), 'htmltemplate') for name in os.listdir(tmpldir): fullpath = os.path.join(tmpldir, name) outpath = os.path.join(htmldir, name) if os.path.isdir(fullpath): shutil.rmtree(outpath, ignore_errors=True) shutil.copytree(fullpath, outpath) continue if fullpath.endswith('.swp'): continue content = open(fullpath).read().decode('utf-8') out = pystache.render(content, data) print fullpath with open(outpath, 'w') as file: file.write(out.encode('utf-8')) # store json data file, for other system with open(os.path.join(htmldir, 'data.json'), 'w') as file: json.dump(data, file)
if d == 'UP': return x, y if d == 'DOWN': return w-x, y-y if d == 'RIGHT': return y, w-x if d == 'LEFT': return h-y, x # prepare log and tmp dir logfile = os.getenv('AIRTEST_LOGFILE', 'log/airtest.log') if os.path.exists(logfile): backfile = logfile+'.'+time.strftime('%Y%m%d%H%M%S') os.rename(logfile, backfile) else: base.makedirs(base.dirname(logfile)) jlog = jsonlog.JSONLog(logfile) @patch.record(jlog) class AndroidDevice(object): def __init__(self, serialno=None, pkgname=None): self._last_point = None self._threshold = 0.3 # for findImage self._rotation = None # UP,DOWN,LEFT,RIGHT self._tmpdir = 'tmp' if not os.path.exists(self._tmpdir): base.makedirs(self._tmpdir) self.pkgname = pkgname self.adb, self._serialno = ViewClient.connectToDeviceOrExit(verbose=False, serialno=serialno)
def render(logfile, htmldir): ''' parse logfile and render it to html ''' if not os.path.exists(logfile): sys.exit('logfile: %s not exists' %(logfile)) #htmldir = base.dirname(htmlfile) if not os.path.exists(htmldir): os.makedirs(htmldir) cpus, items = [], [] fpss = [] mems, imgs = [], [] data = { 'info': { 'generated_time': time.strftime('%Y/%m/%d %H:%M:%S'), }, 'items': items, #'cpus': cpus, 'cpu_data': None, 'mem_data': None, #'mems': mems, 'images': imgs, } info = data.get('info') start_time = 0 for line in open(logfile): d = json.loads(line) timestamp = d.get('timestamp') - start_time _type = d.get('type') if _type == 'start': start_time = d.get('timestamp') elif _type == 'record': mem = d.get('mem') if mem: mems.append([timestamp, mem]) cpu = d.get('cpu') if cpu: cpus.append([timestamp, cpu]) fps = d.get('fps') if fps: fpss.append([timestamp, fps]) elif _type == 'snapshot': filename = d.get('filename') basename = os.path.basename(filename) with fuckit: shutil.copyfile(filename, os.path.join(htmldir, basename)) imgs.append({'time':timestamp, 'filename':basename}) #elif d.get('result'): # data['result'] = {'status': d.get('result'), 'detail': d.get('detail')} data['cpu_data'] = json.dumps(cpus) data['mem_data'] = json.dumps(mems) from . import proto records = [] for line in open(logfile): v = json.loads(line) r = {'time': time.strftime(TIME_FORMAT, time.localtime(v.get('timestamp')))} d = v.get('data', {}) tag = v.get('tag') if tag == proto.TAG_FUNCTION: tag = markupsafe.Markup('<span class="glyphicon glyphicon-sound-dolby"></span>') args = map(json.dumps, d.get('args')) kwargs = [ '%s=%s' %(k, json.dumps(_v)) for k, _v in d.get('kwargs', {}).items() ] message = '<code>%s(%s)</code>' %(d.get('name'), ', '.join(args+kwargs)) message = markupsafe.Markup(message) elif tag == proto.TAG_SNAPSHOT: message = d.get('filename') elif tag == proto.TAG_CPU: message = 'total: %d, average: %d' %(d.get('total'), d.get('average')) else: message = None if message: r['tag'] = tag r['message'] = message records.append(r) data['records'] = records def average(ss): if ss: return reduce(lambda x,y: x+y, [value for _,value in ss])/float(len(ss)) return 0.0 data['cpu_average'] = round(average(cpus), 2) data['mem_average'] = round(average(mems), 2) data['fps_average'] = round(average(fpss), 2) tmpldir = os.path.join(base.dirname(__file__), 'htmltemplate') for name in os.listdir(tmpldir): fullpath = os.path.join(tmpldir, name) outpath = os.path.join(htmldir, name) if os.path.isdir(fullpath): shutil.rmtree(outpath, ignore_errors=True) shutil.copytree(fullpath, outpath) continue if fullpath.endswith('.swp'): continue content = open(fullpath).read().decode('utf-8') out = pystache.Renderer(escape=markupsafe.escape).render(content, data) print fullpath with open(outpath, 'w') as file: file.write(out.encode('utf-8')) # store json data file, for other system with open(os.path.join(htmldir, 'data.json'), 'w') as file: json.dump(data, file)
def render(logfile, htmldir): """ parse logfile and render it to html """ if not os.path.exists(logfile): sys.exit("logfile: %s not exists" % (logfile)) if not os.path.exists(htmldir): os.makedirs(htmldir) cpus, items = [], [] fpss = [] mems = [] imgs = [] # The render data data = { "info": {"generated_time": time.strftime("%Y/%m/%d %H:%M:%S")}, "items": items, "cpu_data": None, "mem_data": None, "images": imgs, } info = data.get("info") # Read log line by line from . import proto records = [] for line in open(logfile): v = json.loads(line) r = {"time": time.strftime(TIME_FORMAT, time.localtime(v.get("timestamp")))} d = v.get("data", {}) tag = v.get("tag") # Process Function, Snapshot, Memory, CPU ... if tag == proto.TAG_FUNCTION: tag = markupsafe.Markup("function") args = map(json.dumps, d.get("args")) kwargs = ["%s=%s" % (k, json.dumps(_v)) for k, _v in d.get("kwargs", {}).items()] message = '<code style="color:green">%s(%s)</code>' % (d.get("name"), ", ".join(args + kwargs)) message = markupsafe.Markup(message) elif tag == proto.TAG_SNAPSHOT: message = markupsafe.Markup("<img width=100%% src='%s'/>" % d.get("filename")) elif tag == proto.TAG_CPU: message = "%d%%" % (d) cpus.append([r, d]) elif tag == proto.TAG_MEMORY: mems.append([r, d["PSS"]]) message = json.dumps(d) else: message = None if message: r["tag"] = tag r["message"] = message records.append(r) # Calculate average cpu and mem data["records"] = records def average(ss): if ss: return reduce(lambda x, y: x + y, [value for _, value in ss]) / float(len(ss)) return 0.0 data["cpu_average"] = round(average(cpus), 2) data["mem_average"] = round(average(mems), 2) data["fps_average"] = round(average(fpss), 2) tmpldir = os.path.join(base.dirname(__file__), "htmltemplate") for name in os.listdir(tmpldir): fullpath = os.path.join(tmpldir, name) outpath = os.path.join(htmldir, name) if os.path.isdir(fullpath): shutil.rmtree(outpath, ignore_errors=True) shutil.copytree(fullpath, outpath) continue if fullpath.endswith(".swp"): continue content = open(fullpath).read().decode("utf-8") out = pystache.Renderer(escape=markupsafe.escape).render(content, data) print fullpath with open(outpath, "w") as file: file.write(out.encode("utf-8")) # store json data file, for other system with open(os.path.join(htmldir, "data.json"), "w") as file: json.dump(data, file) # Copy snapshots if htmldir != ".": shutil.rmtree(os.path.join(htmldir, "tmp"), ignore_errors=True) shutil.copytree("tmp", os.path.join(htmldir, "tmp"))
def render(logfile, htmldir): ''' parse logfile and render it to html ''' if not os.path.exists(logfile): sys.exit('logfile: %s not exists' % (logfile)) if not os.path.exists(htmldir): os.makedirs(htmldir) cpus, items = [], [] fpss = [] mems = [] imgs = [] # The render data data = { 'info': { 'generated_time': time.strftime('%Y/%m/%d %H:%M:%S'), }, 'items': items, 'cpu_data': None, 'mem_data': None, 'images': imgs, } info = data.get('info') # Read log line by line from . import proto records = [] for line in open(logfile): v = json.loads(line) r = { 'time': time.strftime(TIME_FORMAT, time.localtime(v.get('timestamp'))) } d = v.get('data', {}) tag = v.get('tag') # Process Function, Snapshot, Memory, CPU ... if tag == proto.TAG_FUNCTION: tag = markupsafe.Markup('function') args = map(json.dumps, d.get('args')) kwargs = [ '%s=%s' % (k, json.dumps(_v)) for k, _v in d.get('kwargs', {}).items() ] message = '<code style="color:green">%s(%s)</code>' % ( d.get('name'), ', '.join(args + kwargs)) message = markupsafe.Markup(message) elif tag == proto.TAG_SNAPSHOT: message = markupsafe.Markup("<img width=100%% src='%s'/>" % d.get('filename')) elif tag == proto.TAG_CPU: message = '%d%%' % (d) cpus.append([r, d]) elif tag == proto.TAG_MEMORY: mems.append([r, d['PSS']]) message = json.dumps(d) else: message = None if message: r['tag'] = tag r['message'] = message records.append(r) # Calculate average cpu and mem data['records'] = records def average(ss): if ss: return reduce(lambda x, y: x + y, [value for _, value in ss]) / float(len(ss)) return 0.0 data['cpu_average'] = round(average(cpus), 2) data['mem_average'] = round(average(mems), 2) data['fps_average'] = round(average(fpss), 2) tmpldir = os.path.join(base.dirname(__file__), 'htmltemplate') for name in os.listdir(tmpldir): fullpath = os.path.join(tmpldir, name) outpath = os.path.join(htmldir, name) if os.path.isdir(fullpath): shutil.rmtree(outpath, ignore_errors=True) shutil.copytree(fullpath, outpath) continue if fullpath.endswith('.swp'): continue content = open(fullpath).read().decode('utf-8') out = pystache.Renderer(escape=markupsafe.escape).render(content, data) print fullpath with open(outpath, 'w') as file: file.write(out.encode('utf-8')) # store json data file, for other system with open(os.path.join(htmldir, 'data.json'), 'w') as file: json.dump(data, file) # Copy snapshots if htmldir != '.': shutil.rmtree(os.path.join(htmldir, 'tmp'), ignore_errors=True) shutil.copytree('tmp', os.path.join(htmldir, 'tmp'))