py.lib

Yohn Y. 2019-11-11 Child:fe4a96d06243

11:9a4eb7660c11 Go to Latest

py.lib/log/slog_console.py

+ Добавлены простые логгеры

History
     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()