1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
import logging
import decorator
def filter_maxsize(val, maxsize_list, maxsize_dict, maxsize_string) :
if isinstance(val, (list, tuple)) :
if len(val) > maxsize_list :
return "[...]"
return [filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string)
for child in val]
elif isinstance(val, dict) :
if len(val) > maxsize_dict :
return "{...}"
return dict([
(key, filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string))
for (key, child) in val.items()])
elif isinstance(val, (basestring, buffer)) :
if len(val) > maxsize_string :
return "'...'"
return val
else :
val = repr(val)
if len(val) > maxsize_string :
return "<...>"
return val
TRACE=9
logging.addLevelName(TRACE, 'TRACE')
# TODO: lazy evaluation of parameters
def trace(skip_args=[], skip_kwargs=[], maxsize_list=30, maxsize_dict=30, maxsize_string=300) :
def _trace(f, *args, **kwargs) :
params_formatted = ", ".join(
[repr(filter_maxsize(a, maxsize_list, maxsize_dict, maxsize_string))
for (idx, a) in enumerate(args) if idx not in skip_args]+\
['%s=%r' % (k,filter_maxsize(v, maxsize_list, maxsize_dict, maxsize_string))
for (k,v) in kwargs.items() if k not in skip_kwargs])
logging.log(TRACE, "%s(%s) invoked", f.__name__, params_formatted)
try :
res=f(*args, **kwargs)
except :
logging.exception("Exception occured in %s", f.__name__, exc_info=True)
raise
logging.log(TRACE, "%s(%s) returned %r", f.__name__, params_formatted,
filter_maxsize(res, maxsize_list, maxsize_dict, maxsize_string))
return res
return decorator.decorator(_trace)
|