py.lib

Yohn Y. 2020-08-02 Parent:cab7fedf8432 Child:7e0e6ee3031b

14:50ff84d0bc56 Go to Latest

py.lib/log/slog_syslogger.py

* db/sqlite.py: Импортируем полезные классы для реакции на ошибки

History
awgur@13 1 # coding: utf-8
awgur@13 2
awgur@13 3 """\
awgur@13 4 Логирование в системный журнал Unix
awgur@9 5
awgur@9 6 Метки в журнале о уровне сообщения:
awgur@9 7 "`": Debug
awgur@9 8 ".": Info
awgur@9 9 "*": Warning
awgur@9 10 "!": Error
awgur@9 11 "#": Alert
awgur@9 12 """
awgur@13 13
awgur@9 14 import syslog
awgur@13 15 from sys import exc_info
awgur@9 16 from time import time
awgur@13 17 from traceback import extract_tb, extract_stack
awgur@13 18 from datetime import timedelta
awgur@9 19
awgur@9 20 LOG_FACILITY = {
awgur@9 21 'auth': syslog.LOG_AUTH,
awgur@9 22 'authpriv': syslog.LOG_AUTH,
awgur@9 23 'cron': syslog.LOG_CRON,
awgur@9 24 'daemon': syslog.LOG_DAEMON,
awgur@9 25 'ftp': syslog.LOG_DAEMON,
awgur@9 26 'kern': syslog.LOG_KERN,
awgur@9 27 'lpr': syslog.LOG_LPR,
awgur@9 28 'mail': syslog.LOG_MAIL,
awgur@9 29 'news': syslog.LOG_NEWS,
awgur@9 30 'syslog': syslog.LOG_SYSLOG,
awgur@9 31 'user': syslog.LOG_USER,
awgur@9 32 'uucp': syslog.LOG_UUCP,
awgur@9 33 'local0': syslog.LOG_LOCAL0,
awgur@9 34 'local1': syslog.LOG_LOCAL1,
awgur@9 35 'local2': syslog.LOG_LOCAL2,
awgur@9 36 'local3': syslog.LOG_LOCAL3,
awgur@9 37 'local4': syslog.LOG_LOCAL4,
awgur@9 38 'local5': syslog.LOG_LOCAL5,
awgur@9 39 'local6': syslog.LOG_LOCAL6,
awgur@9 40 'local7': syslog.LOG_LOCAL7
awgur@9 41 }
awgur@9 42
awgur@13 43 class LoggerError(Exception): pass
awgur@13 44
awgur@13 45
awgur@9 46 # --- INTERFACE --- #
awgur@9 47 FACILITY = LOG_FACILITY['user']
awgur@13 48
awgur@13 49
awgur@13 50 def log_prep(ident, facility='user'):
awgur@9 51 global FACILITY
awgur@9 52 if not facility.lower() in LOG_FACILITY:
awgur@9 53 raise LoggerError('Unknown facility')
awgur@13 54
awgur@9 55 syslog.openlog(ident, syslog.LOG_PID)
awgur@9 56
awgur@9 57 FACILITY = LOG_FACILITY[facility]
awgur@9 58
awgur@9 59
awgur@13 60 class Timing(object):
awgur@13 61 def __init__(self, name=None):
awgur@13 62 if name is None:
awgur@13 63 self.prefix = ''
awgur@9 64 else:
awgur@13 65 self.prefix = '%s :: ' % name
awgur@13 66 self.tsAll = time()
awgur@13 67 self.ts = self.tsAll
awgur@9 68
awgur@13 69 def getTime(self):
awgur@13 70 return time() - self.ts
awgur@9 71
awgur@13 72 def reset(self):
awgur@13 73 self.ts = time()
awgur@13 74 self.tsAll = self.ts
awgur@9 75
awgur@9 76 def __str__(self):
awgur@13 77 ts = time()
awgur@13 78 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
awgur@9 79
awgur@13 80 def __call__(self, msg):
awgur@13 81 _buf = '%s | %s' % (self, msg)
awgur@13 82 self.ts = time()
awgur@13 83 return _buf
awgur@9 84
awgur@9 85
awgur@13 86 class SysLogger(object):
awgur@13 87 init_log = log_prep
awgur@9 88
awgur@13 89 @staticmethod
awgur@13 90 def get_timing(name=None):
awgur@13 91 return Timing(name)
awgur@9 92
awgur@13 93 def __init__(self, prefix, facility=FACILITY):
awgur@13 94 self.prefix = str(prefix)
awgur@13 95 self.facility = facility
awgur@9 96
awgur@13 97 def _write(self, flag, mark, msg):
awgur@13 98 for l in str(msg).splitlines():
awgur@13 99 syslog.syslog(self.facility | flag, '%s: %s %s' % (self.prefix, mark, l))
awgur@9 100
awgur@13 101 def __call__(self, msg):
awgur@13 102 self._write(syslog.LOG_INFO, '.', msg)
awgur@9 103
awgur@13 104 def err(self, msg):
awgur@13 105 self._write(syslog.LOG_ERR, '!', msg)
awgur@9 106
awgur@13 107 def warn(self, msg):
awgur@13 108 self._write(syslog.LOG_WARNING, '*', msg)
awgur@9 109
awgur@13 110 def debug(self, msg):
awgur@13 111 self._write(syslog.LOG_DEBUG, '`', msg)
awgur@9 112
awgur@13 113 def alert(self, msg):
awgur@13 114 self._write(syslog.LOG_ALERT, '#', msg)
awgur@9 115
awgur@13 116 def sublog(self, prefix):
awgur@13 117 return self.__class__('%s/%s' % (self.prefix, prefix), self.facility)
awgur@9 118
awgur@13 119 def excpt(self, msg, eClass=None, eObj=None, eTb=None, stack_skip=0):
awgur@13 120 if eClass is None:
awgur@13 121 eClass, eObj, eTb = exc_info()
awgur@9 122
awgur@13 123 if eClass is None:
awgur@13 124 # Если вдруг вызываем без произошедшего исключения
awgur@13 125 self.err(msg)
awgur@13 126 else:
awgur@13 127 tbData_tb = list(extract_tb(eTb))[::-1]
awgur@13 128 tbData_stack = list(extract_stack())[::-1][(2 + stack_skip):]
awgur@9 129
awgur@13 130 self.err(msg)
awgur@9 131
awgur@13 132 self.err('--- EXCEPTION ---')
awgur@13 133 self.err(' %s (%s)' % (eClass.__name__, eObj))
awgur@9 134
awgur@13 135 self.err('--- TRACEBACK ---')
awgur@13 136 for _tbFile, _tbLine, _tbFunc, _tbText in tbData_tb:
awgur@13 137 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc))
awgur@13 138 self.err(' %s' % _tbText)
awgur@9 139
awgur@13 140 self.err('>>> Exception Handler <<<')
awgur@13 141 for _tbFile, _tbLine, _tbFunc, _tbText in tbData_stack:
awgur@13 142 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc))
awgur@13 143 self.err(' %s' % _tbText)
awgur@9 144
awgur@13 145 self.err('--- END EXCEPTION ---')