py.lib
2022-08-13
Parent:fe4a96d06243
py.lib/log/slog_console.py
* С разбегу влетел в type hinting, пришлось обкладывать костылями. И этот процесс судя по всему длительный, и место больное будет долго...
| awgur@11 | 1 # coding: utf-8 |
| awgur@11 | 2 """ Логирование на консоль |
| awgur@11 | 3 |
| awgur@11 | 4 Метки в журнале о уровне сообщения: |
| awgur@11 | 5 "`": Debug |
| awgur@11 | 6 ".": Info |
| awgur@11 | 7 "*": Warning |
| awgur@11 | 8 "!": Error |
| awgur@11 | 9 "#": Alert |
| awgur@11 | 10 """ |
| awgur@11 | 11 |
| awgur@30 | 12 from time import monotonic |
| awgur@11 | 13 from datetime import timedelta |
| awgur@11 | 14 from sys import exc_info, stderr, stdout |
| awgur@11 | 15 from traceback import extract_tb, extract_stack |
| awgur@11 | 16 |
| awgur@11 | 17 |
| awgur@11 | 18 class Timing(object): |
| awgur@11 | 19 def __init__(self, name=None): |
| awgur@11 | 20 if name is None: |
| awgur@11 | 21 self.prefix = '' |
| awgur@11 | 22 else: |
| awgur@11 | 23 self.prefix = '%s :: ' % name |
| awgur@30 | 24 self.tsAll = monotonic() |
| awgur@11 | 25 self.ts = self.tsAll |
| awgur@11 | 26 |
| awgur@11 | 27 def getTime(self): |
| awgur@30 | 28 return monotonic() - self.ts |
| awgur@11 | 29 |
| awgur@11 | 30 def reset(self): |
| awgur@30 | 31 self.ts = monotonic() |
| awgur@11 | 32 self.tsAll = self.ts |
| awgur@11 | 33 |
| awgur@11 | 34 def __str__(self): |
| awgur@30 | 35 ts = monotonic() |
| awgur@11 | 36 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts) |
| awgur@11 | 37 |
| awgur@11 | 38 def __call__(self, msg): |
| awgur@11 | 39 _buf = '%s | %s' % (self, msg) |
| awgur@30 | 40 self.ts = monotonic() |
| awgur@11 | 41 return _buf |
| awgur@11 | 42 |
| awgur@11 | 43 |
| awgur@11 | 44 class ConsoleLog(object): |
| awgur@11 | 45 def __init__(self, appname='main'): |
| awgur@11 | 46 self.appname = appname |
| awgur@11 | 47 |
| awgur@11 | 48 @staticmethod |
| awgur@11 | 49 def _write(ItrCntnt): |
| awgur@11 | 50 for l in ItrCntnt: |
| awgur@11 | 51 print(l) |
| awgur@11 | 52 |
| awgur@11 | 53 def __call__(self, msg): |
| awgur@11 | 54 self._write(map( |
| awgur@11 | 55 lambda x: '%3s | %s :: %s' % ('.', self.appname, x), |
| awgur@11 | 56 str(msg).splitlines() |
| awgur@11 | 57 )) |
| awgur@11 | 58 |
| awgur@11 | 59 def err(self, msg): |
| awgur@11 | 60 self._write(map( |
| awgur@11 | 61 lambda x: '%3s | %s :: %s' % ('!', self.appname, x), |
| awgur@11 | 62 str(msg).splitlines() |
| awgur@11 | 63 )) |
| awgur@11 | 64 |
| awgur@11 | 65 def warn(self, msg): |
| awgur@11 | 66 self._write(map( |
| awgur@11 | 67 lambda x: '%3s | %s :: %s' % ('*', self.appname, x), |
| awgur@11 | 68 str(msg).splitlines() |
| awgur@11 | 69 )) |
| awgur@11 | 70 |
| awgur@11 | 71 def alert(self, msg): |
| awgur@11 | 72 self._write(map( |
| awgur@11 | 73 lambda x: '%3s | %s :: %s' % ('#', self.appname, x), |
| awgur@11 | 74 str(msg).splitlines() |
| awgur@11 | 75 )) |
| awgur@11 | 76 |
| awgur@11 | 77 def debug(self, msg): |
| awgur@11 | 78 self._write(map( |
| awgur@11 | 79 lambda x: '%3s | %s :: %s' % ('`', self.appname, x), |
| awgur@11 | 80 str(msg).splitlines() |
| awgur@11 | 81 )) |
| awgur@11 | 82 |
| awgur@11 | 83 @staticmethod |
| awgur@11 | 84 def getTiming(name=None): |
| awgur@11 | 85 return Timing(name) |
| awgur@11 | 86 |
| awgur@11 | 87 def sublog(self, name): |
| awgur@11 | 88 return self.__class__('%s/%s' % (self.appname, name)) |
| awgur@11 | 89 |
| awgur@11 | 90 def excpt(self, msg, eClass=None, eObj=None, eTb=None, stack_skip=0): |
| awgur@11 | 91 if eClass is None: |
| awgur@11 | 92 eClass, eObj, eTb = exc_info() |
| awgur@11 | 93 |
| awgur@11 | 94 tbData_tb = list(extract_tb(eTb))[::-1] |
| awgur@11 | 95 tbData_stack = list(extract_stack())[::-1][(2 + stack_skip):] |
| awgur@11 | 96 self.err(msg) |
| awgur@11 | 97 self.err('--- EXCEPTION ---') |
| awgur@11 | 98 self.err(' %s (%s)' % (eClass.__name__, eObj)) |
| awgur@11 | 99 self.err('--- TRACEBACK ---') |
| awgur@11 | 100 for _tbFile, _tbLine, _tbFunc, _tbText in tbData_tb: |
| awgur@11 | 101 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc)) |
| awgur@11 | 102 self.err(' %s' % _tbText) |
| awgur@11 | 103 self.err('>>> Exception Handler <<<') |
| awgur@11 | 104 for _tbFile, _tbLine, _tbFunc, _tbText in tbData_stack: |
| awgur@11 | 105 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc)) |
| awgur@11 | 106 self.err(' %s' % _tbText) |
| awgur@11 | 107 self.err('--- END EXCEPTION ---') |
| awgur@11 | 108 |
| awgur@11 | 109 |
| awgur@11 | 110 class StderrLog(ConsoleLog): |
| awgur@11 | 111 @staticmethod |
| awgur@11 | 112 def _write(msgItr): |
| awgur@11 | 113 for l in msgItr: |
| awgur@11 | 114 stderr.write('%s\n' % l) |
| awgur@11 | 115 stderr.flush() |
| awgur@11 | 116 |
| awgur@11 | 117 |
| awgur@11 | 118 class StdoutLog(ConsoleLog): |
| awgur@11 | 119 @staticmethod |
| awgur@11 | 120 def _write(msgItr): |
| awgur@11 | 121 for l in msgItr: |
| awgur@11 | 122 stdout.write('%s\n' % l) |
| awgur@11 | 123 stdout.flush() |