py.lib
31:4186c3b229fa
Go to Latest
py.lib/log/slog_syslogger.py
+ Модуль работы с датаклассами и их наполнения из ORM
+ Утилиты Bottle
+ Утилиты JWT
+ Помошник в парсинге конфигурационных файлов
4 Логирование в системный журнал Unix
6 Метки в журнале о уровне сообщения:
15 from sys import exc_info
16 from time import monotonic
17 from traceback import extract_tb, extract_stack
18 from datetime import timedelta
19 from typing import Any
22 'auth': syslog.LOG_AUTH,
23 'authpriv': syslog.LOG_AUTH,
24 'cron': syslog.LOG_CRON,
25 'daemon': syslog.LOG_DAEMON,
26 'ftp': syslog.LOG_DAEMON,
27 'kern': syslog.LOG_KERN,
28 'lpr': syslog.LOG_LPR,
29 'mail': syslog.LOG_MAIL,
30 'news': syslog.LOG_NEWS,
31 'syslog': syslog.LOG_SYSLOG,
32 'user': syslog.LOG_USER,
33 'uucp': syslog.LOG_UUCP,
34 'local0': syslog.LOG_LOCAL0,
35 'local1': syslog.LOG_LOCAL1,
36 'local2': syslog.LOG_LOCAL2,
37 'local3': syslog.LOG_LOCAL3,
38 'local4': syslog.LOG_LOCAL4,
39 'local5': syslog.LOG_LOCAL5,
40 'local6': syslog.LOG_LOCAL6,
41 'local7': syslog.LOG_LOCAL7
45 class LoggerError(Exception): pass
49 FACILITY = LOG_FACILITY['user']
52 def check_facility(facility: str = 'user'):
53 if not facility.lower() in LOG_FACILITY:
54 raise LoggerError(f'Unknown facility: {facility}')
57 def log_prep(ident: str, facility: str = 'user'):
59 check_facility(facility)
61 syslog.openlog(ident, syslog.LOG_PID)
63 FACILITY = LOG_FACILITY[facility]
67 def __init__(self, name: str = None):
71 self.prefix = f'{name} :: '
72 self.tsAll = monotonic()
76 return monotonic() - self.ts
84 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
86 def __call__(self, msg: Any) -> str:
87 _buf = f'{self} | {msg}'
92 class SysLogger(object):
96 def get_timing(name: str = None):
99 def __init__(self, prefix: str = 'main', facility: int = FACILITY):
100 self.prefix = str(prefix)
101 self.facility = facility
103 def _write(self, flag: int, mark: str, msg: Any):
104 for l in str(msg).splitlines():
105 syslog.syslog(self.facility | flag, f'{mark} {self.prefix}: {l}')
107 def __call__(self, msg: Any):
108 self._write(syslog.LOG_INFO, '.', msg)
110 def err(self, msg: Any):
111 self._write(syslog.LOG_ERR, '!', msg)
113 def warn(self, msg: Any):
114 self._write(syslog.LOG_WARNING, '*', msg)
116 def debug(self, msg: Any):
117 self._write(syslog.LOG_DEBUG, '`', msg)
119 def alert(self, msg: Any):
120 self._write(syslog.LOG_ALERT, '#', msg)
122 def sublog(self, prefix: str):
123 return self.__class__(f'{self.prefix}/{prefix}', self.facility)
125 def excpt(self, msg: Any, e_class: type = None, e_obj: Exception = None, e_tb=None, stack_skip=0):
127 e_class, e_obj, e_tb = exc_info()
130 # Если вдруг вызываем без произошедшего исключения
133 tb_data_tb = list(extract_tb(e_tb))[::-1]
134 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
138 self.err('--- EXCEPTION ---')
139 self.err(' %s (%s)' % (e_class.__name__, e_obj))
141 self.err('--- TRACEBACK ---')
142 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
143 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
144 self.err(' %s' % _tb_text)
146 self.err('>>> Exception Handler <<<')
147 for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
148 self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
149 self.err(' %s' % _tb_text)
151 self.err('--- END EXCEPTION ---')