import logging logger = logging.getLogger("fw") RESET_SEQ = "\033[0m" COLOR_SEQ = "\033[1;%dm" BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) COLORS = { "DEBUG": CYAN, "INFO": WHITE, "WARNING": YELLOW, "ERROR": RED, "CRITICAL": MAGENTA } class Formatter(logging.Formatter): def format(self, record): return COLOR_SEQ % (30 + COLORS.get(record.levelname, 0)) + super().format(record) + RESET_SEQ def load(log_level: str) -> None: logger.setLevel(log_level) console_handler = logging.StreamHandler() file_handler = logging.FileHandler("foxworld.log", mode="a", encoding="utf-8") term_formatter = Formatter("[%(asctime)s.%(msecs)03d] [%(threadName)s/%(levelname)s]: %(message)s", datefmt="%Y.%m.%d %H:%M:%S") file_formatter = logging.Formatter("[%(asctime)s.%(msecs)03d] [%(threadName)s/%(levelname)s]: %(message)s", datefmt="%Y.%m.%d %H:%M:%S") console_handler.setFormatter(term_formatter) file_handler .setFormatter(file_formatter) logger.addHandler(console_handler) logger.addHandler(file_handler) def debug(*args, **kwargs): logger.debug(*args, **kwargs) def info(*args, **kwargs): logger.info(*args, **kwargs) def warning(*args, **kwargs): logger.warning(*args, **kwargs) def error(*args, **kwargs): logger.error(*args, **kwargs) def critical(*args, **kwargs): logger.critical(*args, **kwargs) def exception(*args, **kwargs): logger.exception(*args, **kwargs)