11# -*- coding: UTF-8 -*-
22import sys
3+ import time
34import logging
45
56
@@ -13,6 +14,63 @@ def get_logger(name, handler=logging.StreamHandler(sys.stderr), level=logging.DE
1314 """
1415 logger = logging .getLogger (name )
1516 handler .setFormatter (logging .Formatter ('[%(asctime)s] [{}] %(message)s' .format (name )))
17+ handler .setLevel (level )
1618 logger .addHandler (handler )
1719 logger .setLevel (level )
1820 return logger
21+
22+
23+ def log_time (logger = None , log_result = False , log_in_msg = False , request_stage = 'during' ):
24+ """
25+ func used this decorator must satisfy following condition
26+ 1. first parameter is dict, indicate the query instance with query_id and start_time
27+ 2. If log_result is True, logger will print str result or key `log` value of dict result.
28+ Result in other data type will raise exception.
29+ :param logger: python logger object,
30+ :param log_result: whether log func return value
31+ :param log_in_msg: whether log time in msg
32+ :param request_stage: request stage, default is during
33+ :return:
34+ """
35+ if logger is None :
36+ logger = get_logger ('default logger' )
37+
38+ def log_time_func (f ):
39+ new_logger = logger
40+
41+ def wrap (* args , ** kwargs ):
42+ if args and not isinstance (args [0 ], dict ):
43+ if hasattr (args [0 ], 'logger' ):
44+ logger = args [0 ].logger
45+ else :
46+ logger = new_logger
47+ else :
48+ logger = new_logger
49+
50+ name = f .__name__
51+
52+ start = time .time ()
53+ ret = f (* args , ** kwargs )
54+ step_time = time .time () - start
55+ step_time *= 1000
56+
57+ info = {'_funcName' : name ,
58+ 'request_stage' : request_stage ,
59+ 'step_time' : '{:.0f}ms' .format (step_time )}
60+
61+ if log_in_msg :
62+ ret_str_tmpl = '[func_name:{}] [step_time:{}] [request_stage:{}]'
63+ ret_str = ret_str_tmpl .format (name , '{:.0f}ms' .format (step_time ), request_stage )
64+ else :
65+ ret_str = ''
66+
67+ if log_result :
68+ ret_str += ' ' + str (ret )
69+
70+ ret_str = ret_str .strip ()
71+ logger .info (ret_str , extra = info )
72+ return ret
73+
74+ return wrap
75+
76+ return log_time_func
0 commit comments