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 
 | |
| 
 |