py.lib
2019-11-11
Child:7874a3e2281e
py.lib/log/slog_syslogger.py
+ Добавлены простые логгеры
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/log/slog_syslogger.py Mon Nov 11 21:18:14 2019 +0300 1.3 @@ -0,0 +1,99 @@ 1.4 +# coding: utf-8 1.5 +""" 1.6 +Тривиальная реализация сислоггера без блэк-джека и поэтесс 1.7 + 1.8 +Метки в журнале о уровне сообщения: 1.9 + "`": Debug 1.10 + ".": Info 1.11 + "*": Warning 1.12 + "!": Error 1.13 + "#": Alert 1.14 + 1.15 +""" 1.16 +from time import time 1.17 +from datetime import timedelta 1.18 + 1.19 +import syslog 1.20 +from traceback import extract_tb, extract_stack 1.21 +from sys import exc_info 1.22 + 1.23 + 1.24 +class Timing(object): 1.25 + def __init__(self, name=None): 1.26 + if name is None: 1.27 + self.prefix = '' 1.28 + else: 1.29 + self.prefix = '%s :: ' % name 1.30 + self.tsAll = time() 1.31 + self.ts = self.tsAll 1.32 + 1.33 + def getTime(self): 1.34 + return time() - self.ts 1.35 + 1.36 + def reset(self): 1.37 + self.ts = time() 1.38 + self.tsAll = self.ts 1.39 + 1.40 + def __str__(self): 1.41 + ts = time() 1.42 + return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts) 1.43 + 1.44 + def __call__(self, msg): 1.45 + _buf = '%s | %s' % (self, msg) 1.46 + self.ts = time() 1.47 + return _buf 1.48 + 1.49 + 1.50 +class SimpleSysLogger(object): 1.51 + @staticmethod 1.52 + def initSyslog(ident): 1.53 + syslog.openlog(ident, syslog.LOG_PID) 1.54 + 1.55 + @staticmethod 1.56 + def getTiming(name=None): 1.57 + return Timing(name) 1.58 + 1.59 + def __init__(self, prefix, facility=syslog.LOG_USER): 1.60 + self.prefix = str(prefix) 1.61 + self.facility = facility 1.62 + 1.63 + def _write(self, flag, mark, msg): 1.64 + for l in str(msg).splitlines(): 1.65 + syslog.syslog(self.facility | flag, '%s: %s %s' % (self.prefix, mark, l)) 1.66 + 1.67 + def __call__(self, msg): 1.68 + self._write(syslog.LOG_INFO, '.', msg) 1.69 + 1.70 + def err(self, msg): 1.71 + self._write(syslog.LOG_ERR, '!', msg) 1.72 + 1.73 + def warn(self, msg): 1.74 + self._write(syslog.LOG_WARNING, '*', msg) 1.75 + 1.76 + def debug(self, msg): 1.77 + self._write(syslog.LOG_DEBUG, '`', msg) 1.78 + 1.79 + def alert(self, msg): 1.80 + self._write(syslog.LOG_ALERT, '#', msg) 1.81 + 1.82 + def sublog(self, prefix): 1.83 + return self.__class__('%s/%s' % (self.prefix, prefix), self.facility) 1.84 + 1.85 + def excpt(self, msg, eClass=None, eObj=None, eTb=None, stack_skip=0): 1.86 + if eClass is None: 1.87 + eClass, eObj, eTb = exc_info() 1.88 + 1.89 + tbData_tb = list(extract_tb(eTb))[::-1] 1.90 + tbData_stack = list(extract_stack())[::-1][(2 + stack_skip):] 1.91 + self.err(msg) 1.92 + self.err('--- EXCEPTION ---') 1.93 + self.err(' %s (%s)' % (eClass.__name__, eObj)) 1.94 + self.err('--- TRACEBACK ---') 1.95 + for _tbFile, _tbLine, _tbFunc, _tbText in tbData_tb: 1.96 + self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc)) 1.97 + self.err(' %s' % _tbText) 1.98 + self.err('>>> Exception Handler <<<') 1.99 + for _tbFile, _tbLine, _tbFunc, _tbText in tbData_stack: 1.100 + self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc)) 1.101 + self.err(' %s' % _tbText) 1.102 + self.err('--- END EXCEPTION ---') 1.103 \ No newline at end of file