py.lib.aw_log

Yohn Y. 2024-02-11 Parent:894923fbd0d0 Child:1e93862d5063

2:69904de0e695 Go to Latest

py.lib.aw_log/src/aw_log/__init__.py

. Скрипт для сборки пакета

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