py.lib

Yohn Y. 2022-07-17 Child:b8fc22566efd

28:d6032160c314 Go to Latest

py.lib/log/tiny_slog.py

. Переименовние log/slog_syslogger_tiny.py -> log/tiny_slog.py

History
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/log/tiny_slog.py	Sun Jul 17 11:39:25 2022 +0300
     1.3 @@ -0,0 +1,103 @@
     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 init_syslog(ident):
    1.53 +        syslog.openlog(ident, syslog.LOG_PID)
    1.54 +
    1.55 +    @staticmethod
    1.56 +    def get_timing(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, f'{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 sub_log(self, prefix):
    1.83 +        return self.__class__('%s/%s' % (self.prefix, prefix), self.facility)
    1.84 +
    1.85 +    def excpt(self, msg, e_class=None, e_obj=None, e_tback=None, stack_skip=0):
    1.86 +        if e_class is None:
    1.87 +            e_class, e_obj, e_tback = exc_info()
    1.88 +        
    1.89 +        tb_data_tb = list(extract_tb(e_tback))[::-1]
    1.90 +        tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
    1.91 +
    1.92 +        self.err(msg)
    1.93 +        self.err('--- EXCEPTION ---')
    1.94 +        self.err(' %s (%s)' % (e_class.__name__, e_obj))
    1.95 +
    1.96 +        self.err('--- TRACEBACK ---')
    1.97 +        for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_tb:
    1.98 +            self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
    1.99 +            self.err('   %s' % _tb_text)
   1.100 +
   1.101 +        self.err('>>> Exception Handler <<<')
   1.102 +        for _tb_file, _tb_line, _tb_func, _tb_text in tb_data_stack:
   1.103 +            self.err('File: %s, line %s in %s' % (_tb_file, _tb_line, _tb_func))
   1.104 +            self.err('   %s' % _tb_text)
   1.105 +
   1.106 +        self.err('--- END EXCEPTION ---')