py.lib.aw_log

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

3:4ab8c8590cab Go to Latest

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

. Оформление репозитория

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