Source code for mast_contributor_tools.utils.logger_config

import logging
import os
import re


[docs] class CustomLoggingFormatter(logging.Formatter): """ Provides some additional formatting for the logger, color-coding the output so that: 'DEBUG' messages are in gray 'WARNING' messages are in yellow 'ERROR' messages are in red 'CRITICAL' messages are in green Modified from : https://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output """
[docs] def color_code(self, record) -> str: """ Returns the color-coded format for a log record """ grey = "\x1b[38;20m" yellow = "\x1b[33;20m" red = "\x1b[31;20m" bold_red = "\x1b[31;1m" green = "\x1b[1;32m" reset = "\x1b[0m" msg_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" # Set color by log message level FORMATS = { logging.DEBUG: grey + msg_format + reset, logging.INFO: grey + msg_format + reset, logging.WARNING: yellow + msg_format + reset, logging.ERROR: red + msg_format + reset, logging.CRITICAL: green + msg_format + reset, } log_fmt = FORMATS.get(record.levelno) # Additional logic if specific strings are present in log message # Individual field and file verdicts if ": 'FAIL'" in record.msg: log_fmt = bold_red + msg_format + reset elif ": 'NEEDS REVIEW'" in record.msg: log_fmt = yellow + msg_format + reset elif ": 'PASS'" in record.msg: log_fmt = green + msg_format + reset # Total score for file list if "All files passed!" in record.msg: log_fmt = green + msg_format + reset elif "Files Failed" in record.msg: n_failed = int(re.findall(r"Files Failed: (\d+)", record.msg)[0]) print(n_failed) if n_failed > 0: # make text red if any files failed log_fmt = bold_red + msg_format + reset if not log_fmt: log_fmt = grey + msg_format + reset return log_fmt
[docs] def format(self, record) -> str: log_fmt = self.color_code(record) formatter = logging.Formatter(log_fmt) return formatter.format(record)
[docs] def setup_logger(name: str, level: int = logging.INFO) -> logging.Logger: """Create a custom logger.""" logger = logging.getLogger(name) logger.setLevel(level) # Create handlers c_handler = logging.StreamHandler() f_handler = logging.FileHandler(os.path.join(os.path.dirname(__file__), "../mct.log")) c_handler.setLevel(level) f_handler.setLevel(level) # Create formatters and add it to handlers c_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") f_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") c_handler.setFormatter(c_format) f_handler.setFormatter(f_format) # Color code the text for the terminal output c_handler.setFormatter(CustomLoggingFormatter()) # Add handlers to the logger logger.addHandler(c_handler) logger.addHandler(f_handler) return logger