py.lib

Yohn Y. 2022-08-14 Parent:fe4a96d06243

34:84b54a8a6d4c Go to Latest

py.lib/log/tiny_slog.py

+ Возможность обработки параметров конфигурации перед добавлением в класс конфигурации . Переформатирование части кода по PEP

History
awgur@28 1 # coding: utf-8
awgur@28 2 """
awgur@28 3 Тривиальная реализация сислоггера без блэк-джека и поэтесс
awgur@28 4
awgur@28 5 Метки в журнале о уровне сообщения:
awgur@28 6 "`": Debug
awgur@28 7 ".": Info
awgur@28 8 "*": Warning
awgur@28 9 "!": Error
awgur@28 10 "#": Alert
awgur@28 11
awgur@28 12 """
awgur@30 13 from time import monotonic
awgur@28 14 from datetime import timedelta
awgur@28 15
awgur@28 16 import syslog
awgur@28 17 from traceback import extract_tb, extract_stack
awgur@28 18 from sys import exc_info
awgur@28 19
awgur@28 20
awgur@28 21 class Timing(object):
awgur@28 22 def __init__(self, name=None):
awgur@28 23 if name is None:
awgur@28 24 self.prefix = ''
awgur@28 25 else:
awgur@28 26 self.prefix = '%s :: ' % name
awgur@30 27 self.tsAll = monotonic()
awgur@28 28 self.ts = self.tsAll
awgur@28 29
awgur@28 30 def getTime(self):
awgur@30 31 return monotonic() - self.ts
awgur@28 32
awgur@28 33 def reset(self):
awgur@30 34 self.ts = monotonic()
awgur@28 35 self.tsAll = self.ts
awgur@28 36
awgur@28 37 def __str__(self):
awgur@30 38 ts = monotonic()
awgur@28 39 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
awgur@28 40
awgur@28 41 def __call__(self, msg):
awgur@28 42 _buf = '%s | %s' % (self, msg)
awgur@30 43 self.ts = monotonic()
awgur@28 44 return _buf
awgur@28 45
awgur@28 46
awgur@28 47 class SimpleSysLogger(object):
awgur@28 48 @staticmethod
awgur@28 49 def init_syslog(ident):
awgur@28 50 syslog.openlog(ident, syslog.LOG_PID)
awgur@28 51
awgur@28 52 @staticmethod
awgur@28 53 def get_timing(name=None):
awgur@28 54 return Timing(name)
awgur@28 55
awgur@29 56 def __init__(self, prefix='main', facility=syslog.LOG_USER):
awgur@28 57 self.prefix = str(prefix)
awgur@28 58 self.facility = facility
awgur@28 59
awgur@28 60 def _write(self, flag, mark, msg):
awgur@28 61 for l in str(msg).splitlines():
awgur@28 62 syslog.syslog(self.facility | flag, f'{self.prefix}: {mark} {l}')
awgur@28 63
awgur@28 64 def __call__(self, msg):
awgur@28 65 self._write(syslog.LOG_INFO, '.', msg)
awgur@28 66
awgur@28 67 def err(self, msg):
awgur@28 68 self._write(syslog.LOG_ERR, '!', msg)
awgur@28 69
awgur@28 70 def warn(self, msg):
awgur@28 71 self._write(syslog.LOG_WARNING, '*', msg)
awgur@28 72
awgur@28 73 def debug(self, msg):
awgur@28 74 self._write(syslog.LOG_DEBUG, '`', msg)
awgur@28 75
awgur@28 76 def alert(self, msg):
awgur@28 77 self._write(syslog.LOG_ALERT, '#', msg)
awgur@28 78
awgur@28 79 def sub_log(self, prefix):
awgur@28 80 return self.__class__('%s/%s' % (self.prefix, prefix), self.facility)
awgur@28 81
awgur@28 82 def excpt(self, msg, e_class=None, e_obj=None, e_tback=None, stack_skip=0):
awgur@28 83 if e_class is None:
awgur@28 84 e_class, e_obj, e_tback = exc_info()
awgur@28 85
awgur@28 86 tb_data_tb = list(extract_tb(e_tback))[::-1]
awgur@28 87 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
awgur@28 88
awgur@28 89 self.err(msg)
awgur@28 90 self.err('--- EXCEPTION ---')
awgur@28 91 self.err(' %s (%s)' % (e_class.__name__, e_obj))
awgur@28 92
awgur@28 93 self.err('--- TRACEBACK ---')
awgur@28 94 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
awgur@28 95 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
awgur@28 96 self.err(' %s' % _tb_text)
awgur@28 97
awgur@28 98 self.err('>>> Exception Handler <<<')
awgur@28 99 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
awgur@28 100 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
awgur@28 101 self.err(' %s' % _tb_text)
awgur@28 102
awgur@28 103 self.err('--- END EXCEPTION ---')