py.lib
2019-11-11
Child:fe4a96d06243
py.lib/log/slog_console.py
+ Добавлены простые логгеры
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/log/slog_console.py Mon Nov 11 21:18:14 2019 +0300 1.3 @@ -0,0 +1,123 @@ 1.4 +# coding: utf-8 1.5 +""" Логирование на консоль 1.6 + 1.7 +Метки в журнале о уровне сообщения: 1.8 + "`": Debug 1.9 + ".": Info 1.10 + "*": Warning 1.11 + "!": Error 1.12 + "#": Alert 1.13 +""" 1.14 + 1.15 +from time import time 1.16 +from datetime import timedelta 1.17 +from sys import exc_info, stderr, stdout 1.18 +from traceback import extract_tb, extract_stack 1.19 + 1.20 + 1.21 +class Timing(object): 1.22 + def __init__(self, name=None): 1.23 + if name is None: 1.24 + self.prefix = '' 1.25 + else: 1.26 + self.prefix = '%s :: ' % name 1.27 + self.tsAll = time() 1.28 + self.ts = self.tsAll 1.29 + 1.30 + def getTime(self): 1.31 + return time() - self.ts 1.32 + 1.33 + def reset(self): 1.34 + self.ts = time() 1.35 + self.tsAll = self.ts 1.36 + 1.37 + def __str__(self): 1.38 + ts = time() 1.39 + return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts) 1.40 + 1.41 + def __call__(self, msg): 1.42 + _buf = '%s | %s' % (self, msg) 1.43 + self.ts = time() 1.44 + return _buf 1.45 + 1.46 + 1.47 +class ConsoleLog(object): 1.48 + def __init__(self, appname='main'): 1.49 + self.appname = appname 1.50 + 1.51 + @staticmethod 1.52 + def _write(ItrCntnt): 1.53 + for l in ItrCntnt: 1.54 + print(l) 1.55 + 1.56 + def __call__(self, msg): 1.57 + self._write(map( 1.58 + lambda x: '%3s | %s :: %s' % ('.', self.appname, x), 1.59 + str(msg).splitlines() 1.60 + )) 1.61 + 1.62 + def err(self, msg): 1.63 + self._write(map( 1.64 + lambda x: '%3s | %s :: %s' % ('!', self.appname, x), 1.65 + str(msg).splitlines() 1.66 + )) 1.67 + 1.68 + def warn(self, msg): 1.69 + self._write(map( 1.70 + lambda x: '%3s | %s :: %s' % ('*', self.appname, x), 1.71 + str(msg).splitlines() 1.72 + )) 1.73 + 1.74 + def alert(self, msg): 1.75 + self._write(map( 1.76 + lambda x: '%3s | %s :: %s' % ('#', self.appname, x), 1.77 + str(msg).splitlines() 1.78 + )) 1.79 + 1.80 + def debug(self, msg): 1.81 + self._write(map( 1.82 + lambda x: '%3s | %s :: %s' % ('`', self.appname, x), 1.83 + str(msg).splitlines() 1.84 + )) 1.85 + 1.86 + @staticmethod 1.87 + def getTiming(name=None): 1.88 + return Timing(name) 1.89 + 1.90 + def sublog(self, name): 1.91 + return self.__class__('%s/%s' % (self.appname, name)) 1.92 + 1.93 + def excpt(self, msg, eClass=None, eObj=None, eTb=None, stack_skip=0): 1.94 + if eClass is None: 1.95 + eClass, eObj, eTb = exc_info() 1.96 + 1.97 + tbData_tb = list(extract_tb(eTb))[::-1] 1.98 + tbData_stack = list(extract_stack())[::-1][(2 + stack_skip):] 1.99 + self.err(msg) 1.100 + self.err('--- EXCEPTION ---') 1.101 + self.err(' %s (%s)' % (eClass.__name__, eObj)) 1.102 + self.err('--- TRACEBACK ---') 1.103 + for _tbFile, _tbLine, _tbFunc, _tbText in tbData_tb: 1.104 + self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc)) 1.105 + self.err(' %s' % _tbText) 1.106 + self.err('>>> Exception Handler <<<') 1.107 + for _tbFile, _tbLine, _tbFunc, _tbText in tbData_stack: 1.108 + self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc)) 1.109 + self.err(' %s' % _tbText) 1.110 + self.err('--- END EXCEPTION ---') 1.111 + 1.112 + 1.113 +class StderrLog(ConsoleLog): 1.114 + @staticmethod 1.115 + def _write(msgItr): 1.116 + for l in msgItr: 1.117 + stderr.write('%s\n' % l) 1.118 + stderr.flush() 1.119 + 1.120 + 1.121 +class StdoutLog(ConsoleLog): 1.122 + @staticmethod 1.123 + def _write(msgItr): 1.124 + for l in msgItr: 1.125 + stdout.write('%s\n' % l) 1.126 + stdout.flush()