18:58 pm, 11th April, Friday, 2025

import os
import sys
import logging
 
class ColorLevelFormatter(logging.Formatter):
    RESET = "\033[0m"
    COLORS = {
        logging.DEBUG: "\033[94m",    # Blue
        logging.INFO: "\033[92m",     # Green
        logging.WARNING: "\033[93m",  # Yellow
        logging.ERROR: "\033[91m",    # Red
        logging.CRITICAL: "\033[95m"  # Magenta
    }
    PATH_COLOR = "\033[96m"   # Cyan
    FUNC_COLOR = "\033[93m"   # Yellow
    LINE_COLOR = "\033[95m"   # Magenta
    MODULE_COLOR = "\033[91m" # Tomato
 
    def format(self, record):
        level_color = self.COLORS.get(record.levelno, self.RESET)
        record.levelname = f"{level_color}{record.levelname}{self.RESET}"
        record.pathname = f"{self.PATH_COLOR}{record.pathname}{self.RESET}"
        record.funcName = f"{self.FUNC_COLOR}{record.funcName}{self.RESET}"
        record.lineno = f"{self.LINE_COLOR}{record.lineno}{self.RESET}"
        record.module = f"{self.MODULE_COLOR}{record.module}{self.RESET}"
        return super().format(record)
 
 
def setup_logger(
    name: str = __name__,
    logfile: str = "logfile.log",
    level: int = None,
    stream: bool = True
) -> logging.Logger:
    logger = logging.getLogger(name)
    logger.setLevel(level or os.getenv("LOG_LEVEL", logging.DEBUG))
 
    # File handler with no colors
    file_handler = logging.FileHandler(logfile)
    file_handler.setLevel(logging.DEBUG)
    file_formatter = logging.Formatter(
        "%(asctime)s %(levelname)-6s {%(pathname)s} (%(funcName)s:%(lineno)s) %(message)s",
        datefmt="%d-%m-%Y %H:%M:%S"
    )
    file_handler.setFormatter(file_formatter)
    logger.addHandler(file_handler)
 
    # Console handler with color
    if stream:
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(logging.DEBUG)
        console_formatter = ColorLevelFormatter(
            "%(levelname)-6s {%(module)s} (%(funcName)s:%(lineno)s) %(message)s"
        )
        console_handler.setFormatter(console_formatter)
        logger.addHandler(console_handler)
 
    return logger
 

Example Usage

# Example usage
logger = setup_logger()
 
if __name__ == "__main__":
    logger.debug("This is a debug message.")
    logger.info("This is an info message.")
    logger.warning("This is a warning.")
    logger.error("This is an error.")
    logger.critical("Critical issue occurred!")

Links : TODO

Tags :

Date : 11th April, Friday, 2025, (Wikilinks: 11th April, April 25, April, 2025. Friday)

Category : Others