| | |
| | import logging |
| | import os |
| |
|
| | LOG_LEVELS = { |
| | "DEBUG": logging.DEBUG, |
| | "INFO": logging.INFO, |
| | "WARNING": logging.WARNING, |
| | "ERROR": logging.ERROR, |
| | "CRITICAL": logging.CRITICAL, |
| | } |
| |
|
| |
|
| | class ColoredFormatter(logging.Formatter): |
| | """A command line formatter with different colors for each level.""" |
| |
|
| | def __init__(self): |
| | super().__init__() |
| | reset = "\033[0m" |
| | colors = { |
| | logging.DEBUG: f"{reset}\033[36m", |
| | logging.INFO: f"{reset}\033[32m", |
| | logging.WARNING: f"{reset}\033[33m", |
| | logging.ERROR: f"{reset}\033[31m", |
| | logging.CRITICAL: f"{reset}\033[35m", |
| | } |
| | fmt_str = "{color}%(levelname)s %(asctime)s %(process)d %(filename)s:%(lineno)4d:{reset} %(message)s" |
| | self.formatters = { |
| | level: logging.Formatter(fmt_str.format(color=color, reset=reset)) |
| | for level, color in colors.items() |
| | } |
| | self.default_formatter = self.formatters[logging.INFO] |
| |
|
| | def format(self, record): |
| | formatter = self.formatters.get(record.levelno, self.default_formatter) |
| | return formatter.format(record) |
| |
|
| |
|
| | def get_logger(name, level=logging.INFO): |
| | """A command line logger.""" |
| | if "LOG_LEVEL" in os.environ: |
| | level = os.environ["LOG_LEVEL"].upper() |
| | assert ( |
| | level in LOG_LEVELS |
| | ), f"Invalid LOG_LEVEL: {level}, must be one of {list(LOG_LEVELS.keys())}" |
| | level = LOG_LEVELS[level] |
| | logger = logging.getLogger(name) |
| | logger.setLevel(level) |
| | logger.propagate = False |
| | ch = logging.StreamHandler() |
| | ch.setLevel(level) |
| | ch.setFormatter(ColoredFormatter()) |
| | logger.addHandler(ch) |
| | return logger |
| |
|