py.lib

Yohn Y. 2021-06-06 Parent:cab7fedf8432 Child:7e0e6ee3031b

20:1a3d395b5cdf Go to Latest

py.lib/log/slog_syslogger.py

.

History
1 # coding: utf-8
3 """\
4 Логирование в системный журнал Unix
6 Метки в журнале о уровне сообщения:
7 "`": Debug
8 ".": Info
9 "*": Warning
10 "!": Error
11 "#": Alert
12 """
14 import syslog
15 from sys import exc_info
16 from time import time
17 from traceback import extract_tb, extract_stack
18 from datetime import timedelta
20 LOG_FACILITY = {
21 'auth': syslog.LOG_AUTH,
22 'authpriv': syslog.LOG_AUTH,
23 'cron': syslog.LOG_CRON,
24 'daemon': syslog.LOG_DAEMON,
25 'ftp': syslog.LOG_DAEMON,
26 'kern': syslog.LOG_KERN,
27 'lpr': syslog.LOG_LPR,
28 'mail': syslog.LOG_MAIL,
29 'news': syslog.LOG_NEWS,
30 'syslog': syslog.LOG_SYSLOG,
31 'user': syslog.LOG_USER,
32 'uucp': syslog.LOG_UUCP,
33 'local0': syslog.LOG_LOCAL0,
34 'local1': syslog.LOG_LOCAL1,
35 'local2': syslog.LOG_LOCAL2,
36 'local3': syslog.LOG_LOCAL3,
37 'local4': syslog.LOG_LOCAL4,
38 'local5': syslog.LOG_LOCAL5,
39 'local6': syslog.LOG_LOCAL6,
40 'local7': syslog.LOG_LOCAL7
41 }
43 class LoggerError(Exception): pass
46 # --- INTERFACE --- #
47 FACILITY = LOG_FACILITY['user']
50 def log_prep(ident, facility='user'):
51 global FACILITY
52 if not facility.lower() in LOG_FACILITY:
53 raise LoggerError('Unknown facility')
55 syslog.openlog(ident, syslog.LOG_PID)
57 FACILITY = LOG_FACILITY[facility]
60 class Timing(object):
61 def __init__(self, name=None):
62 if name is None:
63 self.prefix = ''
64 else:
65 self.prefix = '%s :: ' % name
66 self.tsAll = time()
67 self.ts = self.tsAll
69 def getTime(self):
70 return time() - self.ts
72 def reset(self):
73 self.ts = time()
74 self.tsAll = self.ts
76 def __str__(self):
77 ts = time()
78 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
80 def __call__(self, msg):
81 _buf = '%s | %s' % (self, msg)
82 self.ts = time()
83 return _buf
86 class SysLogger(object):
87 init_log = log_prep
89 @staticmethod
90 def get_timing(name=None):
91 return Timing(name)
93 def __init__(self, prefix, facility=FACILITY):
94 self.prefix = str(prefix)
95 self.facility = facility
97 def _write(self, flag, mark, msg):
98 for l in str(msg).splitlines():
99 syslog.syslog(self.facility | flag, '%s: %s %s' % (self.prefix, mark, l))
101 def __call__(self, msg):
102 self._write(syslog.LOG_INFO, '.', msg)
104 def err(self, msg):
105 self._write(syslog.LOG_ERR, '!', msg)
107 def warn(self, msg):
108 self._write(syslog.LOG_WARNING, '*', msg)
110 def debug(self, msg):
111 self._write(syslog.LOG_DEBUG, '`', msg)
113 def alert(self, msg):
114 self._write(syslog.LOG_ALERT, '#', msg)
116 def sublog(self, prefix):
117 return self.__class__('%s/%s' % (self.prefix, prefix), self.facility)
119 def excpt(self, msg, eClass=None, eObj=None, eTb=None, stack_skip=0):
120 if eClass is None:
121 eClass, eObj, eTb = exc_info()
123 if eClass is None:
124 # Если вдруг вызываем без произошедшего исключения
125 self.err(msg)
126 else:
127 tbData_tb = list(extract_tb(eTb))[::-1]
128 tbData_stack = list(extract_stack())[::-1][(2 + stack_skip):]
130 self.err(msg)
132 self.err('--- EXCEPTION ---')
133 self.err(' %s (%s)' % (eClass.__name__, eObj))
135 self.err('--- TRACEBACK ---')
136 for _tbFile, _tbLine, _tbFunc, _tbText in tbData_tb:
137 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc))
138 self.err(' %s' % _tbText)
140 self.err('>>> Exception Handler <<<')
141 for _tbFile, _tbLine, _tbFunc, _tbText in tbData_stack:
142 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc))
143 self.err(' %s' % _tbText)
145 self.err('--- END EXCEPTION ---')