py.lib.aw_log

Yohn Y. 2024-10-30 Parent:1e93862d5063

6:9155a66edb31 Go to Latest

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

.. 1.202410.1 . Изменение структуры проекта под новые вызовы SDK Python . Убраны версии с отдельный файлов, они кажутся избыточними. * Изменено формирование записей о исключении, для большего соответствия логике журналирования - Перенос `NullLog` на уровень модуля и повышение его универсальности для замены других классов.

History
1 # coding: utf-8
2 """ Реализация классов логирования
4 Метки в журнале о уровне сообщения:
5 "`": Debug
6 ".": Info
7 "*": Warning
8 "!": Error
9 "#": Alert
11 """
13 from time import monotonic
14 from datetime import timedelta
15 from traceback import extract_tb, extract_stack
16 from typing import Optional, Any, Iterable
17 from sys import exc_info
20 class Timing(object):
21 def __init__(self, name: Optional[str] = None):
22 if name is None:
23 self.prefix = ''
25 else:
26 self.prefix = f'{name} :: '
28 self.tsAll = monotonic()
29 self.ts = self.tsAll
31 def get_time(self):
32 return monotonic() - self.ts
34 def reset(self):
35 self.ts = monotonic()
36 self.tsAll = self.ts
38 def __str__(self):
39 ts = monotonic()
40 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
42 def __call__(self, msg):
43 _buf = f'{self} | {msg}'
44 self.ts = monotonic()
45 return _buf
48 class AbstractLogBase(object):
49 def __init__(self, prefix: str = 'main'):
50 self.prefix = prefix
52 def _write_helper(self, mark: str, msg: Any) -> Iterable[str]:
53 for l in str(msg).splitlines():
54 yield f'{mark} {self.prefix} | {l}\n'
56 def _write(self, mark: str, msg: Any):
57 raise NotImplemented(f'Метод write не определён для класса "{type(self).__name__}"')
59 def __call__(self, msg):
60 self._write('.', msg)
62 def err(self, msg):
63 self._write('!', msg)
65 def warn(self, msg):
66 self._write('*', msg)
68 def alert(self, msg):
69 self._write('#', msg)
71 def debug(self, msg):
72 self._write('`', msg)
74 @staticmethod
75 def get_timing(name: Optional[str] = None):
76 return Timing(name)
78 def sub_log(self, name: str):
79 return self.__class__(f'{self.prefix}/{name}')
81 def excpt(self, msg, e_class=None, e_obj=None, e_tb=None, stack_skip=0):
82 if e_class is None:
83 e_class, e_obj, e_tb = exc_info()
85 tb_data_tb = list(extract_tb(e_tb))[::-1]
86 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
87 self.alert(msg)
88 self.alert('--- EXCEPTION ---')
89 self.alert(f' {e_class.__name__} ({e_obj})')
90 self.alert('--- TRACEBACK ---')
91 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
92 self.alert(f'File: {_tb_file}, line {_tb_line} in {_tb_func}')
93 self.alert(f' {_tb_text}')
95 self.err('>>> Exception Handler <<<')
96 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
97 self.alert(f'File: {_tb_file}, line {_tb_line} in {_tb_func}')
98 self.alert(f' {_tb_text}')
100 self.alert('--- END EXCEPTION ---')
103 class NullLog(AbstractLogBase):
104 def _write(self, mark: str, msg: Any):
105 pass
107 def __init__(self, *a, **kwa):
108 super().__init__('n')
110 def sub_log(self, name: str):
111 return self
113 @classmethod
114 def make(cls, *a, **kwa):
115 return cls()
117 def flush(self, *a, **kwa):
118 pass
120 @staticmethod
121 def init_syslog(ident):
122 pass