/
MaxIs
/
maxlib
Обзор
Документация
Войти
/
MaxIs
/
maxlib
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
logger.py
142 строки
6 KB
MaxIs
Иногда бывает что программы работает продолжительное время и хотелось бы знать что происходит на текущий момент
07 июл 2025, 10:50
07 июл 2025, 10:50
ce38980
Код
Авторство
О чём код?
import datetime from pathlib import Path import csv from chardet import UniversalDetector class DetectFormat: """Класс детектирования кодировки""" @staticmethod def get_encoding(path): detector = UniversalDetector() with open(path, 'rb') as fh: for line in fh: detector.feed(line) if detector.done: break detector.close() return detector.result['encoding'] class LoggerEt: """Класс логгера созданный для более удобной записи и чтения из таблицы csv которая открывается из excel param: pathdir - каталог, где создавать лог """ def __init__(self, pathdir: str): self.path_log = Path(pathdir, 'работа_программы.csv') self.path_log_double = self.path_log self.run_day = datetime.datetime.today().strftime('%d.%m.%Y') self.fields = ['day_work', 'operation_time', 'message', 'work_time'] self.start_log = datetime.datetime.now() self.encoding = 'utf-8' self.msg_dt = None # дата и время записи сообщения self.log = [] @property def path_log_double(self): """Представление переменной path_log_double в _path_log_double""" return self._path_log_double @path_log_double.setter def path_log_double(self, value): """ устанавливаем критический лог для ошибок папка warnings, в ytq подневно будут храниться логи если не будет доступа к основному логу. Лог не будет создан если получилось дополнить подневный :param value: путь до основного лога """ totime = datetime.datetime.now().strftime('%d_%m_%Y_%H_%M_%S') path_str = str(value.parent) + '\\warning\\' + 'warning_' + totime + '.csv' self._path_log_double = Path(path_str) @property def msg_dt(self): """ Каждый раз выводит текущее время до секунд """ self._msg_dt = datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S') return self._msg_dt @msg_dt.setter def msg_dt(self, value): self._msg_dt = value def check_file(self, path: Path): """ Проверка на доступность файла для записи :param path: Path :return: bool """ if path.exists(): self.encoding = DetectFormat.get_encoding(path) try: with open(path, 'r', encoding=self.encoding, newline='\n') as f: cr = csv.reader(f, delimiter=';', dialect='excel') crdata = [] for row in cr: crdata.append(row) with open(path, 'w', encoding=self.encoding, newline='\n') as f: wr = csv.writer(f, delimiter=';', dialect='excel') wr.writerows(crdata) return True except OSError: return False else: return False def add_msg(self, msg: str): """ добавляем сообщение в лог :param msg: cообщение """ wth = int((datetime.datetime.now() - self.start_log).seconds // 3600) wtm = int((datetime.datetime.now() - self.start_log).seconds // 60 % 60) wts = int((datetime.datetime.now() - self.start_log).seconds % 60) work_time = f'{wth:02}:{wtm:02}:{wts:02}' str_msg = [self.run_day, self.msg_dt, msg, work_time] print(f"Дата и время = {self.msg_dt}, затраченное время в секундах = {work_time}. Сообщение = {msg}") self.log.append(str_msg) def get_log(self): """Получаем лог""" return self.log def is_create_log(self): """ Проверка наличия файла, в случае отсутствия его создание :return: False or True """ if self.check_file(self.path_log): return True else: try: with open(self.path_log, 'w', encoding='utf-8', newline='\n') as f: wr = csv.writer(f, delimiter=';', dialect='excel') wr.writerow(self.fields) return True except (OSError, PermissionError) as e: if isinstance(e.strerror, str): err = e.strerror else: err = str(e.winerror) err += f' - {self.path_log}' self.add_msg(err) if not self.path_log_double.parent.exists(): self.path_log_double.parent.mkdir(parents=True, exist_ok=True) with open(self.path_log_double, 'w', encoding='utf-8', newline='\n') as f: wr = csv.writer(f, delimiter=';', dialect='excel') wr.writerow(self.fields) return False def write_log(self): """ Запись лога в файл лога, если нет доступа создаётся новый файл :return: """ if self.is_create_log(): with open(self.path_log, 'a', encoding=self.encoding, newline='\n') as f: wr = csv.writer(f, delimiter=';', dialect='excel') wr.writerows(self.log) else: with open(self.path_log_double, 'a', encoding=self.encoding, newline='\n') as f: wr = csv.writer(f, delimiter=';', dialect='excel') wr.writerows(self.log)