py.lib

Yohn Y. 2022-07-17 Parent:b8fc22566efd

30:fe4a96d06243 Go to Latest

py.lib/log/tiny_slog.py

. Используем в логах monotonic вместо time

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 = ''
25 else:
26 self.prefix = '%s :: ' % name
27 self.tsAll = monotonic()
28 self.ts = self.tsAll
30 def getTime(self):
31 return monotonic() - self.ts
33 def reset(self):
34 self.ts = monotonic()
35 self.tsAll = self.ts
37 def __str__(self):
38 ts = monotonic()
39 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
41 def __call__(self, msg):
42 _buf = '%s | %s' % (self, msg)
43 self.ts = monotonic()
44 return _buf
47 class SimpleSysLogger(object):
48 @staticmethod
49 def init_syslog(ident):
50 syslog.openlog(ident, syslog.LOG_PID)
52 @staticmethod
53 def get_timing(name=None):
54 return Timing(name)
56 def __init__(self, prefix='main', facility=syslog.LOG_USER):
57 self.prefix = str(prefix)
58 self.facility = facility
60 def _write(self, flag, mark, msg):
61 for l in str(msg).splitlines():
62 syslog.syslog(self.facility | flag, f'{self.prefix}: {mark} {l}')
64 def __call__(self, msg):
65 self._write(syslog.LOG_INFO, '.', msg)
67 def err(self, msg):
68 self._write(syslog.LOG_ERR, '!', msg)
70 def warn(self, msg):
71 self._write(syslog.LOG_WARNING, '*', msg)
73 def debug(self, msg):
74 self._write(syslog.LOG_DEBUG, '`', msg)
76 def alert(self, msg):
77 self._write(syslog.LOG_ALERT, '#', msg)
79 def sub_log(self, prefix):
80 return self.__class__('%s/%s' % (self.prefix, prefix), self.facility)
82 def excpt(self, msg, e_class=None, e_obj=None, e_tback=None, stack_skip=0):
83 if e_class is None:
84 e_class, e_obj, e_tback = exc_info()
86 tb_data_tb = list(extract_tb(e_tback))[::-1]
87 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
89 self.err(msg)
90 self.err('--- EXCEPTION ---')
91 self.err(' %s (%s)' % (e_class.__name__, e_obj))
93 self.err('--- TRACEBACK ---')
94 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
95 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
96 self.err(' %s' % _tb_text)
98 self.err('>>> Exception Handler <<<')
99 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
100 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
101 self.err(' %s' % _tb_text)
103 self.err('--- END EXCEPTION ---')