py.lib

Yohn Y. 2022-07-06 Parent:1668cc57225b

26:c6c14e492bd4 Go to Latest

py.lib/log/slog_syslogger_tiny.py

. Исправление опечатки и приведение форматирования к стандарту

History
awgur@11 1 # coding: utf-8
awgur@11 2 """
awgur@11 3 Тривиальная реализация сислоггера без блэк-джека и поэтесс
awgur@11 4
awgur@11 5 Метки в журнале о уровне сообщения:
awgur@11 6 "`": Debug
awgur@11 7 ".": Info
awgur@11 8 "*": Warning
awgur@11 9 "!": Error
awgur@11 10 "#": Alert
awgur@11 11
awgur@11 12 """
awgur@11 13 from time import time
awgur@11 14 from datetime import timedelta
awgur@11 15
awgur@11 16 import syslog
awgur@11 17 from traceback import extract_tb, extract_stack
awgur@11 18 from sys import exc_info
awgur@11 19
awgur@11 20
awgur@11 21 class Timing(object):
awgur@11 22 def __init__(self, name=None):
awgur@11 23 if name is None:
awgur@11 24 self.prefix = ''
awgur@11 25 else:
awgur@11 26 self.prefix = '%s :: ' % name
awgur@11 27 self.tsAll = time()
awgur@11 28 self.ts = self.tsAll
awgur@11 29
awgur@11 30 def getTime(self):
awgur@11 31 return time() - self.ts
awgur@11 32
awgur@11 33 def reset(self):
awgur@11 34 self.ts = time()
awgur@11 35 self.tsAll = self.ts
awgur@11 36
awgur@11 37 def __str__(self):
awgur@11 38 ts = time()
awgur@11 39 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
awgur@11 40
awgur@11 41 def __call__(self, msg):
awgur@11 42 _buf = '%s | %s' % (self, msg)
awgur@11 43 self.ts = time()
awgur@11 44 return _buf
awgur@11 45
awgur@11 46
awgur@11 47 class SimpleSysLogger(object):
awgur@11 48 @staticmethod
awgur@23 49 def init_syslog(ident):
awgur@11 50 syslog.openlog(ident, syslog.LOG_PID)
awgur@11 51
awgur@11 52 @staticmethod
awgur@23 53 def get_timing(name=None):
awgur@11 54 return Timing(name)
awgur@11 55
awgur@11 56 def __init__(self, prefix, facility=syslog.LOG_USER):
awgur@11 57 self.prefix = str(prefix)
awgur@11 58 self.facility = facility
awgur@11 59
awgur@11 60 def _write(self, flag, mark, msg):
awgur@11 61 for l in str(msg).splitlines():
awgur@23 62 syslog.syslog(self.facility | flag, f'{self.prefix}: {mark} {l}')
awgur@11 63
awgur@11 64 def __call__(self, msg):
awgur@11 65 self._write(syslog.LOG_INFO, '.', msg)
awgur@11 66
awgur@11 67 def err(self, msg):
awgur@11 68 self._write(syslog.LOG_ERR, '!', msg)
awgur@11 69
awgur@11 70 def warn(self, msg):
awgur@11 71 self._write(syslog.LOG_WARNING, '*', msg)
awgur@11 72
awgur@11 73 def debug(self, msg):
awgur@11 74 self._write(syslog.LOG_DEBUG, '`', msg)
awgur@11 75
awgur@11 76 def alert(self, msg):
awgur@11 77 self._write(syslog.LOG_ALERT, '#', msg)
awgur@11 78
awgur@23 79 def sub_log(self, prefix):
awgur@11 80 return self.__class__('%s/%s' % (self.prefix, prefix), self.facility)
awgur@11 81
awgur@23 82 def excpt(self, msg, e_class=None, e_obj=None, e_tback=None, stack_skip=0):
awgur@23 83 if e_class is None:
awgur@23 84 e_class, e_obj, e_tback = exc_info()
awgur@11 85
awgur@23 86 tb_data_tb = list(extract_tb(e_tback))[::-1]
awgur@23 87 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
awgur@23 88
awgur@11 89 self.err(msg)
awgur@11 90 self.err('--- EXCEPTION ---')
awgur@23 91 self.err(' %s (%s)' % (e_class.__name__, e_obj))
awgur@23 92
awgur@11 93 self.err('--- TRACEBACK ---')
awgur@23 94 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
awgur@23 95 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
awgur@23 96 self.err(' %s' % _tb_text)
awgur@23 97
awgur@11 98 self.err('>>> Exception Handler <<<')
awgur@23 99 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
awgur@23 100 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
awgur@23 101 self.err(' %s' % _tb_text)
awgur@23 102
awgur@12 103 self.err('--- END EXCEPTION ---')