(self, level_str, *args, **kwargs)
| 39 | self.level = get_env_log_level() |
| 40 | |
| 41 | def log(self, level_str, *args, **kwargs): |
| 42 | level_key = level_str.split(":")[0].strip() |
| 43 | level_val = LOG_LEVELS.get(level_key) |
| 44 | if level_val is None: |
| 45 | raise ValueError(f"Unknown log level: {level_str}") |
| 46 | if self.level >= level_val: |
| 47 | color = COLOR_MAP[level_key] |
| 48 | msg = " ".join(str(arg) for arg in args) |
| 49 | |
| 50 | # Align log level output in square brackets |
| 51 | # ERROR and DEBUG are 5 characters, INFO and WARN have an extra space for alignment |
| 52 | tag = level_key |
| 53 | if tag in ("INFO", "WARN"): |
| 54 | tag += " " |
| 55 | print( |
| 56 | f"{color}[{tag}] {msg}{Color.RESET}", |
| 57 | file=sys.stderr if level_key == "ERROR" else sys.stdout, |
| 58 | **kwargs, |
| 59 | ) |
| 60 | |
| 61 | def error(self, *args, **kwargs): |
| 62 | self.log("ERROR:", *args, **kwargs) |
no test coverage detected