diff --git a/sync/utils/Log.py b/sync/utils/Log.py index 1d1c7fa..1a56486 100644 --- a/sync/utils/Log.py +++ b/sync/utils/Log.py @@ -5,6 +5,19 @@ from pathlib import Path from typing import Optional, Dict, Union +class ColoredFormatter(logging.Formatter): + COLORS = { + logging.DEBUG: "\033[36m", + logging.INFO: "\033[32m", + logging.WARNING: "\033[33m", + logging.ERROR: "\033[31m", + "RESET": "\033[0m" + } + + def format(self, record): + color = self.COLORS.get(record.levelno, self.COLORS["RESET"]) + record.levelname = f"{color}{record.levelname}{self.COLORS['RESET']}" + return super().format(record) class Log: _logger_initialized: dict = {} @@ -14,13 +27,8 @@ class Log: def __init__(self, tag: str, *, enable_log: bool = True, log_dir: Optional[Path] = None): if log_dir is not None: - if self._file_prefix is None: - prefix = tag.lower() - else: - prefix = self._file_prefix - - log_file = f"{prefix}_{date.today()}.log" - log_file = log_dir.joinpath(log_file) + prefix = tag.lower() if self._file_prefix is None else self._file_prefix + log_file = log_dir.joinpath(f"{prefix}_{date.today()}.log") self.clear(log_dir, prefix) else: log_file = None @@ -43,7 +51,7 @@ def i(self, msg: str): self.log(level=logging.INFO, msg=msg) def w(self, msg: str): - self.log(level=logging.WARN, msg=msg) + self.log(level=logging.WARNING, msg=msg) def e(self, msg: str): self.log(level=logging.ERROR, msg=msg) @@ -69,13 +77,7 @@ def set_enable_stdout(cls, value: bool): @classmethod def set_log_level(cls, level: Union[int, str]): levels = cls.levels() - - if isinstance(level, str): - level = levels.get(level, logging.DEBUG) - elif isinstance(level, int) and level not in levels.values(): - level = logging.DEBUG - - cls._log_level = level + cls._log_level = levels.get(level, logging.DEBUG) if isinstance(level, str) else level @classmethod def clear(cls, log_dir: Path, prefix: str, max_num: int = 3): @@ -85,13 +87,6 @@ def clear(cls, log_dir: Path, prefix: str, max_num: int = 3): log_file.unlink() @classmethod - def get_msg(cls, err: BaseException) -> str: - msg = "{} " * len(err.args) - msg = msg.format(*err.args).rstrip() - return f"{err.__class__.__name__}({msg})" - - @classmethod - @functools.lru_cache() def get_logger(cls, name: str = "root", log_file: Optional[Path] = None, log_level: int = logging.DEBUG): logger = logging.getLogger(name) if name in cls._logger_initialized: @@ -100,9 +95,10 @@ def get_logger(cls, name: str = "root", log_file: Optional[Path] = None, log_lev if name.startswith(logger_name): return logger - formatter = logging.Formatter( + formatter = ColoredFormatter( "[%(asctime)s] %(name)s %(levelname)s: %(message)s", - datefmt="%Y/%m/%d %H:%M:%S") + datefmt="%Y/%m/%d %H:%M:%S" + ) if cls._enable_stdout: stdout_handler = logging.StreamHandler(stream=sys.stdout) @@ -117,9 +113,11 @@ def get_logger(cls, name: str = "root", log_file: Optional[Path] = None, log_lev if log_file is not None: log_file.parent.mkdir(parents=True, exist_ok=True) - file_handler = logging.FileHandler(log_file, "a") - file_handler.setFormatter(formatter) + file_handler.setFormatter(logging.Formatter( + "[%(asctime)s] %(name)s %(levelname)s: %(message)s", + datefmt="%Y/%m/%d %H:%M:%S" + )) logger.addHandler(file_handler) logger.setLevel(log_level)