import os import logging from logging.handlers import RotatingFileHandler # COLORED_FORMAT = '%(asctime)-15s [%(levelname)s] %(threadName)-12s ' # NORMAL_FORMAT = '%(filename)s %(funcName)s, line %(lineno)s: %(message)s' COLORED_FORMAT = '[%(levelname)s] %(threadName)-12s ' NORMAL_FORMAT = '%(message)s' # '%(filename)s %(funcName)s, line %(lineno)s: %(message)s' FORMAT = COLORED_FORMAT + NORMAL_FORMAT class ColoredFormatter(logging.Formatter): grey = "\x1b[38;20m" yellow = "\x1b[33;20m" red = "\x1b[31;20m" bold_red = "\x1b[31;1m" white = "\x1b[33;97m" green = "\x1b[33;92m" reset = "\x1b[0m" FORMATS = { logging.DEBUG: white + COLORED_FORMAT + reset + NORMAL_FORMAT, logging.INFO: green + COLORED_FORMAT + reset + NORMAL_FORMAT, logging.WARNING: yellow + COLORED_FORMAT + reset + NORMAL_FORMAT, logging.ERROR: red + COLORED_FORMAT + reset + NORMAL_FORMAT, logging.CRITICAL: bold_red + COLORED_FORMAT + reset + NORMAL_FORMAT } def format(self, record): log_fmt = self.FORMATS.get(record.levelno) formatter = logging.Formatter(log_fmt, datefmt='%Y-%m-%d %I:%M:%S%p') return formatter.format(record) def set_log_folder(path: str): dir = os.path.dirname(path) if len(dir) == 0: dir = "./" os.makedirs(dir, exist_ok=True) def set_logger(name: str = "fds", filename: str = "main.log", level: str = "info", logtest=False): set_log_folder(filename) logging_levels = ( logging.CRITICAL, logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG, ) log_level = getattr(logging, level.upper()) assert log_level in logging_levels log = logging.getLogger(name) log.setLevel(log_level) file_handler = RotatingFileHandler(filename, maxBytes=100000000, backupCount=10) file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(logging.Formatter(FORMAT)) log.addHandler(file_handler) stream_handler = logging.StreamHandler() # stream_handler.setLevel(log_level) stream_handler.setLevel(logging.DEBUG) stream_handler.setFormatter(ColoredFormatter()) log.addHandler(stream_handler) if logtest: t_log = getattr(log, level) t_log(f"Logging level: {level.upper()}") log.info("You can see below log labels") log.debug("DEBUG level") log.info("INFO level") log.warning("WARNING level") log.error("ERROR level") log.critical("CRITICAL level") return log