py.lib.aw_log
py.lib.aw_log/src/aw_log/__init__.py
* Отсутствие переноса при форматировании строки лога
| 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 ---') |