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