72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
|
|
class Message(object):
|
|
def __init__(self, processor, *args):
|
|
self.content = args
|
|
self.processor = processor
|
|
self.keywords = (processor.logger._ident,
|
|
processor.name)
|
|
|
|
def strcontent(self):
|
|
return " ".join(map(str, self.content))
|
|
|
|
def strprefix(self):
|
|
return '[%s] ' % ":".join(map(str, self.keywords))
|
|
|
|
def __str__(self):
|
|
return self.strprefix() + self.strcontent()
|
|
|
|
class Processor(object):
|
|
def __init__(self, logger, name, consume):
|
|
self.logger = logger
|
|
self.name = name
|
|
self.consume = consume
|
|
|
|
def __call__(self, *args):
|
|
try:
|
|
consume = self.logger._override
|
|
except AttributeError:
|
|
consume = self.consume
|
|
if consume is not None:
|
|
msg = Message(self, *args)
|
|
consume(msg)
|
|
|
|
class Logger(object):
|
|
_key2logger = {}
|
|
|
|
def __init__(self, ident):
|
|
self._ident = ident
|
|
self._key2logger[ident] = self
|
|
self._keywords = ()
|
|
|
|
def set_sub(self, **kwargs):
|
|
for name, value in kwargs.items():
|
|
self._setsub(name, value)
|
|
|
|
def ensure_sub(self, **kwargs):
|
|
for name, value in kwargs.items():
|
|
if not hasattr(self, name):
|
|
self._setsub(name, value)
|
|
|
|
def set_override(self, consumer):
|
|
self._override = lambda msg: consumer(msg)
|
|
|
|
def del_override(self):
|
|
try:
|
|
del self._override
|
|
except AttributeError:
|
|
pass
|
|
|
|
def _setsub(self, name, dest):
|
|
assert "_" not in name
|
|
setattr(self, name, Processor(self, name, dest))
|
|
|
|
def get(ident="global", **kwargs):
|
|
""" return the Logger with id 'ident', instantiating if appropriate """
|
|
try:
|
|
log = Logger._key2logger[ident]
|
|
except KeyError:
|
|
log = Logger(ident)
|
|
log.ensure_sub(**kwargs)
|
|
return log
|
|
|