from dataclasses import dataclass from logging.handlers import RotatingFileHandler from enum import IntEnum from typing import Optional import logging @dataclass class Log: class Level(IntEnum): CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 name: str level: Level file: Optional[str] = None format: str = '[%(name)s] %(asctime)s - %(levelname)s - %(message)s' date_format: str = '%Y-%m-%d %H:%M:%S' def create_logger(self): logger = logging.getLogger(self.name) logger.setLevel(self.level) formatter = logging.Formatter(self.format, self.date_format) self._add_handler(logger, logging.StreamHandler(), formatter) if self.file: self._add_handler(logger, RotatingFileHandler(self.file, maxBytes=1000000, backupCount=3), formatter) return logger def _add_handler(self, logger: logging.Logger, handler: logging.Handler, formatter: logging.Formatter): handler.setLevel(self.level) handler.setFormatter(formatter) logger.addHandler(handler)