py.lib.aw_log
9:e673daec06dc
Go to Latest
py.lib.aw_log/src/aw_log/__init__.py
.. 1.202606.3
. Смешанный приоритет при выводе сообщения о исключении
2 """ Реализация классов логирования
4 Метки в журнале о уровне сообщения:
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
22 Организация работы с таймерами
24 def __init__(self, name: Optional[str] = None):
29 self.prefix = f'{name} :: '
31 self.ts_all = monotonic()
35 return monotonic() - self.ts
43 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.ts_all)), ts - self.ts)
45 def __call__(self, msg):
46 _buf = f'{self} | {msg}'
51 class AbstractLogBase:
52 def __init__(self, prefix: str = 'main'):
55 def _write_helper(self, mark: str, msg: Any) -> Iterable[str]:
56 for l in str(msg).splitlines():
57 yield f'{mark} {self.prefix} | {l}\n'
59 def _write(self, mark: str, msg: Any):
60 raise NotImplemented(f'Метод write не определён для класса "{type(self).__name__}"')
62 def __call__(self, msg):
78 def get_timing(name: Optional[str] = None):
82 def format_msg(msg: str, **kwa) -> str:
84 Создаём сообщение, более дружелюбное к средствам разбора логов.
85 Ориентир на ``victoria_logs`` и её ``unpack_logfmt``
87 :param msg: Основное сообщение
88 :param kwa: Набор ключ-значение, для добавления в сообщения в качестве
89 разбираемых системой элементов, пригодных для фильтрации
90 :returns: Строку, которую необходимо отправить в лог методом с нужным уровнем важности.
93 for k, v in kwa.items():
104 return f'{msg} |{data}'
106 def sub_log(self, name: str):
107 return self.__class__(f'{self.prefix}/{name}')
109 def excpt(self, msg, e_class=None, e_obj=None, e_tb=None, stack_skip=0):
111 e_class, e_obj, e_tb = exc_info()
113 tb_data_tb = list(extract_tb(e_tb))[::-1]
114 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
116 self.alert('--- EXCEPTION ---')
117 self.alert(f' {e_class.__name__} ({e_obj})')
118 self.alert('--- TRACEBACK ---')
119 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
120 self.alert(f'File: {_tb_file}, line {_tb_line} in {_tb_func}')
121 self.alert(f' {_tb_text}')
123 self.alert('>>> Exception Handler <<<')
124 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
125 self.alert(f'File: {_tb_file}, line {_tb_line} in {_tb_func}')
126 self.alert(f' {_tb_text}')
128 self.alert('--- END EXCEPTION ---')
131 class NullLog(AbstractLogBase):
132 def _write(self, mark: str, msg: Any):
135 def __init__(self, *a, **kwa):
136 super().__init__('n')
138 def sub_log(self, name: str):
142 def make(cls, *a, **kwa):
145 def flush(self, *a, **kwa):
149 def init_syslog(ident):