from logging import handlers import logging from pathlib import Path import sys class ConsoleColor: """Simple shortcut to use colors in console""" HEADER = '\033[95m' BLUE = '\033[94m' GREEN = '\033[92m' ORANGE = '\033[93m' RED = '\033[91m' ENDCOLOR = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' class ColoredFormatter(logging.Formatter): """Formatter changing the record during format : adds colors to levelname""" def format(self, record): levelno = record.levelno if levelno == logging.ERROR: levelname_color = ConsoleColor.RED + record.levelname + ConsoleColor.ENDCOLOR elif levelno == logging.WARNING: levelname_color = ConsoleColor.ORANGE + record.levelname + ConsoleColor.ENDCOLOR elif levelno == logging.INFO: levelname_color = ConsoleColor.GREEN + record.levelname + ConsoleColor.ENDCOLOR elif levelno == logging.DEBUG: levelname_color = ConsoleColor.BLUE + record.levelname + ConsoleColor.ENDCOLOR else: levelname_color = record.levelname record.levelname = levelname_color return logging.Formatter.format(self, record) def create_logger(name: str, level: int, log_dir: Path | None = None, stdout=False) -> logging.Logger: logger = logging.getLogger(name) logger.setLevel(level) if log_dir is not None: log_dir.mkdir(parents=True, exist_ok=True) logger.setLevel(level) file_log_handler = handlers.RotatingFileHandler( log_dir / f'{name}.log', maxBytes=500000, backupCount=5) file_log_handler.setLevel(level) log_formatter = logging.Formatter('%(asctime)s %(levelname)s : %(message)s') file_log_handler.setFormatter(log_formatter) logger.addHandler(file_log_handler) if stdout: terminal_log_handler = logging.StreamHandler(sys.stdout) terminal_log_handler.setLevel(level) colored_log_formatter = ColoredFormatter('%(asctime)s %(levelname)s : %(message)s') terminal_log_handler.setFormatter(colored_log_formatter) logger.addHandler(terminal_log_handler) return logger