logger.py
1 from __future__ import division 2 from builtins import object 3 from past.utils import old_div 4 import ujson as json 5 from utils.dict_utils import set_deep,get_deep 6 import sys 7 8 # Singleton class for logging 9 class Logger(object): 10 instance = None 11 12 class __Logger(object): 13 def __init__(self,output_file): 14 self.output_file = output_file 15 # raise exception here 16 self.cur_line = {} 17 self.counter = {} 18 19 def dump_line(self): 20 line = json.dumps(self.cur_line) 21 if self.output_file is None: 22 sys.stdout.write(line) 23 sys.stdout.write('\n') 24 else: 25 with open(self.output_file,'a') as f: 26 f.write(line) 27 f.write('\n') 28 self.cur_line = {} 29 self.counter = {} 30 31 def set(self,key,value): 32 set_deep(self.cur_line,key,value) 33 34 def average(self,key,value): 35 cur_value = get_deep(self.cur_line,key,0) 36 cur_count = get_deep(self.counter,key,0) 37 set_deep(self.cur_line,key,old_div((float(cur_value)*cur_count+value),(cur_count+1))) 38 set_deep(self.counter,key,cur_count+1) 39 40 def __init__(self,output_file=None): 41 if not Logger.instance: 42 Logger.instance = Logger.__Logger(output_file) 43 44 def __getattr__(self,name): 45 return getattr(self.instance,name)