py.lib

Yohn Y. 2023-01-28 Parent:log/tiny_slog.py@fe4a96d06243

43:6f8bea109183 Go to Latest

py.lib/log/log_syslog.py

. Наведение порядка в коде логирования

History
1 # coding: utf-8
2 """
3 Тривиальная реализация сислоггера без блэк-джека и поэтесс
5 Метки в журнале о уровне сообщения:
6 "`": Debug
7 ".": Info
8 "*": Warning
9 "!": Error
10 "#": Alert
12 """
13 from time import monotonic
14 from datetime import timedelta
16 import syslog
17 from traceback import extract_tb, extract_stack
18 from sys import exc_info
21 class Timing(object):
22 def __init__(self, name=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 SysLogger(object):
50 @staticmethod
51 def init_syslog(ident):
52 syslog.openlog(ident, syslog.LOG_PID)
54 @staticmethod
55 def get_timing(name=None):
56 return Timing(name)
58 def __init__(self, prefix='main', facility=syslog.LOG_USER):
59 self.prefix = str(prefix)
60 self.facility = facility
62 def _write(self, flag, mark, msg):
63 for l in str(msg).splitlines():
64 syslog.syslog(self.facility | flag, f'{mark} {self.prefix} | {l}')
66 def __call__(self, msg):
67 self._write(syslog.LOG_INFO, '.', msg)
69 def err(self, msg):
70 self._write(syslog.LOG_ERR, '!', msg)
72 def warn(self, msg):
73 self._write(syslog.LOG_WARNING, '*', msg)
75 def debug(self, msg):
76 self._write(syslog.LOG_DEBUG, '`', msg)
78 def alert(self, msg):
79 self._write(syslog.LOG_ALERT, '#', msg)
81 def sub_log(self, prefix):
82 return self.__class__(f'{self.prefix}/{prefix}', self.facility)
84 def excpt(self, msg, e_class=None, e_obj=None, e_tback=None, stack_skip=0):
85 if e_class is None:
86 e_class, e_obj, e_tback = exc_info()
88 tb_data_tb = list(extract_tb(e_tback))[::-1]
89 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
91 self.err(msg)
92 self.err('--- EXCEPTION ---')
93 self.err(f' {e_class.__name__} ({e_obj})')
95 self.err('--- TRACEBACK ---')
96 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
97 self.err(f'File: {_tb_file}, line {_tb_line} in {_tb_func}')
98 self.err(f' {_tb_text}')
100 self.err('>>> Exception Handler <<<')
101 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
102 self.err(f'File: {_tb_file}, line {_tb_line} in {_tb_func}')
103 self.err(f' {_tb_text}')
105 self.err('--- END EXCEPTION ---')