tools.win_pg_dump_controller
5:7de4fb4ef2f5
Go to Latest
tools.win_pg_dump_controller/win_pg_dump_controller/log_controller.py
. Не тот порт по умолчанию для postgres
5 Метки в журнале о уровне сообщения:
13 from time import time, ctime
14 from datetime import timedelta, datetime
15 from sys import exc_info
16 from os.path import join as p_join
17 from os import listdir, remove as file_remove, stat
18 from traceback import extract_tb, extract_stack
19 from typing import Optional
21 from .config import Config
25 def __init__(self, name: Optional[str] = None):
29 self.prefix = f'{name} :: '
34 return time() - self.ts
42 return self.prefix + '%s(%.4f)' % (timedelta(seconds=(ts - self.tsAll)), ts - self.ts)
44 def __call__(self, msg):
45 _buf = f'{self} | {msg}'
50 class BaseLogger(object):
51 def __init__(self, appname='main'):
52 self.appname = appname
55 def _write(itr_content):
56 raise NotImplemented()
58 def __call__(self, msg):
60 lambda x: '%3s | %s :: %s' % ('.', self.appname, x),
66 lambda x: '%3s | %s :: %s' % ('!', self.appname, x),
72 lambda x: '%3s | %s :: %s' % ('*', self.appname, x),
78 lambda x: '%3s | %s :: %s' % ('#', self.appname, x),
84 lambda x: '%3s | %s :: %s' % ('`', self.appname, x),
89 def get_timing(name: Optional[str] = None):
92 def sublog(self, name):
93 return self.__class__(f'{self.appname}/{name}')
95 def excpt(self, msg, e_class=None, e_obj=None, e_tb=None, stack_skip=0):
97 e_class, e_obj, e_tb = exc_info()
99 tb_data_tb = list(extract_tb(e_tb))[::-1]
100 tb_data_stack = list(extract_stack())[::-1][(2 + stack_skip):]
102 self.err('--- EXCEPTION ---')
103 self.err(' %s (%s)' % (e_class.__name__, e_obj))
104 self.err('--- TRACEBACK ---')
105 for _tbFile, _tbLine, _tbFunc, _tbText in tb_data_tb:
106 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc))
107 self.err(' %s' % _tbText)
108 self.err('>>> Exception Handler <<<')
109 for _tbFile, _tbLine, _tbFunc, _tbText in tb_data_stack:
110 self.err('File: %s, line %s in %s' % (_tbFile, _tbLine, _tbFunc))
111 self.err(' %s' % _tbText)
112 self.err('--- END EXCEPTION ---')
115 class NullLogger(BaseLogger):
117 def _write(itr_content):
121 class FileLogger(BaseLogger):
122 def __init__(self, filename: str, appname: str = 'main'):
123 super().__init__(appname)
124 self.fd = open(filename, 'a')
126 def _write(self, itr_content):
128 for i in itr_content:
129 self.fd.write(f'{cur_time}{i}\n')
140 class LogController(object):
141 def __init__(self, config: Config):
142 self.log_dir = config.log_dir
143 self.keep_logs_days = config.keep_logs_days
148 def _get_timeprefix() -> str:
149 return datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
151 def get_logger(self, name: str) -> BaseLogger:
152 if self.log_dir is not None:
153 _log_name = p_join(self.log_dir, f'{self._get_timeprefix()} - {name}.log')
154 if name.lower() != 'main':
155 self.log_files.append(_log_name)
158 self.main_log = _log_name
160 return FileLogger(_log_name, appname=name)
163 return NullLogger(appname=name)
165 def get_filename(self, name: str) -> Optional[str]:
166 if self.log_dir is not None:
167 return str(p_join(self.log_dir, f'{self._get_timeprefix()} - {name}.log'))
170 if self.log_dir is not None:
172 for f in listdir(self.log_dir):
173 f_path = p_join(self.log_dir, f)
174 f_stat = stat(f_path)
176 if divmod(now - f_stat.st_ctime, 86400)[0] > self.keep_logs_days: