import logging from django.conf import settings # Colors RED = "\033[91m" PURPLE = "\033[95m" YELLOW = "\033[93m" RESET = "\033[0m" class CustomFormatter(logging.Formatter): def format(self, record): if record.levelname == "ERROR": color = RED elif record.levelname == "WARNING": color = YELLOW elif record.levelname in ["INFO", "DEBUG"]: color = PURPLE else: color = RESET record.levelname = f"{color}{record.levelname}{RESET}" if record.args: try: record.msg = record.msg % record.args record.args = () except (TypeError, ValueError): record.msg = f"{color}{record.msg}{RESET}" # Highlight the final formatted message record.msg = self.highlight_message(record.msg, color) # pedro says: I discovered that trace is provided anyway with # this commented (reason: strange None msgs) # is this needed? ### provide trace when DEBUG config #if settings.DEBUG: # import traceback # print(traceback.format_exc()) return super().format(record) def highlight_message(self, message, color): return f"{color}{message}{RESET}"