10
10
from sclapp import locale
12
import sys, traceback, logging, time
12
import traceback, logging, time
13
13
from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL
17
17
except ImportError:
18
18
from sclapp.legacy_support import wraps
20
from pytagsfs.specialfile.logfile import VirtualLogFile
22
21
class VirtualLogFileStream(object):
23
22
def write(self, s):
24
VirtualLogFile.log_write(s)
23
# Re-bind write method on first invocation to avoid performance hit
24
# from importing on every call (necessary to avoid import loop via
26
from pytagsfs.specialfile.logfile import VirtualLogFile
27
self.write = VirtualLogFile.log_write
29
34
logger = logging.getLogger()
31
37
class FormatterWithMicroseconds(logging.Formatter):
32
38
def formatTime(self, record, datefmt):
33
39
ct = self.converter(record.created)
36
42
s = s.replace('${us}', '%03d' % record.msecs)
39
46
formatter = FormatterWithMicroseconds(
40
47
'[%(asctime)s] %(message)s',
44
52
stderr_handler = logging.StreamHandler()
45
53
stderr_handler.setFormatter(formatter)
47
56
virtual_log_file_handler = logging.StreamHandler(VirtualLogFileStream())
48
57
virtual_log_file_handler.setFormatter(formatter)
50
60
logger.addHandler(virtual_log_file_handler)
52
63
def set_log_level(lvl):
53
64
logger.setLevel(lvl)
55
67
def set_logsize(size):
68
from pytagsfs.specialfile.logfile import VirtualLogFile
56
69
VirtualLogFile.set_max_length(size)
58
72
stderr_enabled = False
59
74
def enable_stderr():
60
75
global stderr_enabled
61
76
if not stderr_enabled:
62
77
logger.addHandler(stderr_handler)
63
78
stderr_enabled = True
81
def log_debug(*args, **kwargs):
82
logger.debug(*args, **kwargs)
85
def log_info(*args, **kwargs):
86
logger.info(*args, **kwargs)
89
def log_warning(*args, **kwargs):
90
logger.warning(*args, **kwargs)
93
def log_error(*args, **kwargs):
94
logger.error(*args, **kwargs)
97
def log_critical(*args, **kwargs):
98
logger.critical(*args, **kwargs)
101
def log_loud(*args, **kwargs):
82
102
if not stderr_enabled:
103
logger.addHandler(stderr_handler)
105
log_critical(*args, **kwargs)
107
logger.removeHandler(stderr_handler)
109
log_critical(*args, **kwargs)
85
112
def log_traceback():
86
113
log_critical(traceback.format_exc())
88
116
def ignore_exceptions(*ignored_exceptions):
89
117
def decorator(fn):
99
def exceptionally_logged(ignore):
100
decorate_immediately = False
101
if hasattr(ignore, '__call__'):
102
decorate_immediately = True
108
def new_fn(*args, **kwargs):
110
return fn(*args, **kwargs)
118
if decorate_immediately:
122
def describe_function(fn):
124
if hasattr(fn, 'im_class') and fn.im_class:
125
parts.append(fn.im_class.__module__)
126
parts.append(fn.im_class.__name__)
127
parts.append(fn.im_func.__name__)
128
elif hasattr(fn, 'im_func') and fn.im_func:
129
parts.append(fn.im_func.__module__)
130
parts.append(fn.im_func.__name__)
132
parts.append(fn.__name__)
133
return '.'.join(parts)
137
def new_fn(*args, **kwargs):
138
log_debug('(Entering %s)' % describe_function(fn))
140
retval = fn(*args, **kwargs)
142
log_debug('(Leaving %s)' % describe_function(fn))
146
def verbosely_logged(fn):
148
def new_fn(*args, **kwargs):
149
log_debug('(Entering %s: args=%s, kwargs=%s)' % (
150
describe_function(fn), repr(args), repr(kwargs)))
152
retval = fn(*args, **kwargs)
154
log_debug('(Exception raised in %s: %s)' % (describe_function(fn), repr(e)))
156
log_debug('(Leaving %s: returning %s)' % (describe_function(fn), repr(retval)))