Skip to content

Instantly share code, notes, and snippets.

@VietThan
Created September 10, 2024 20:44
Show Gist options
  • Save VietThan/399de00657583c197df50091102a5e32 to your computer and use it in GitHub Desktop.
Save VietThan/399de00657583c197df50091102a5e32 to your computer and use it in GitHub Desktop.
logger with custom format
import logging
from typing import Any
# Custom formatter class
class CustomFormatter(logging.Formatter):
green = "\x1b[32m"
bold_green = "\x1b[1;32m"
grey = "\x1b[30m"
bold_grey = "\x1b[1;30m"
yellow = "\x1b[33m"
bold_yellow = "\x1b[1;33m"
red = "\x1b[31m"
bold_red = "\x1b[1;31m"
purple = "\x1b[35m"
bold_purple = "\x1b[1;35m"
blue = "\x1b[36m"
bold_blue = "\x1b[1;36m"
bold_white = "\x1b[1m"
reset = "\033[0m"
FORMATS = {
logging.DEBUG: f"[{blue}%(asctime)s{reset}][{bold_grey}%(levelname)-5.5s{reset}] %(message)s ({grey}%(pathname)s:%(lineno)s{reset})",
logging.INFO: f"[{blue}%(asctime)s{reset}][{bold_green}%(levelname)-5.5s{reset}] %(message)s ({grey}%(pathname)s:%(lineno)s{reset})",
logging.WARNING: f"[{blue}%(asctime)s{reset}][{bold_yellow}%(levelname)-5.5s{reset}] %(message)s ({grey}%(pathname)s:%(lineno)s{reset})",
logging.ERROR: f"[{blue}%(asctime)s{reset}][{bold_red}%(levelname)-5.5s{reset}] %(message)s ({grey}%(pathname)s:%(lineno)s{reset})",
logging.CRITICAL: f"[{blue}%(asctime)s{reset}][{bold_purple}%(levelname)-5.5s{reset}] %(message)s ({grey}%(pathname)s:%(lineno)s{reset})",
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(log_fmt)
return formatter.format(record)
# Define a CLI logging handler with custom formatter
cli_logging_handler = logging.StreamHandler()
cli_logging_handler.setFormatter(CustomFormatter())
cli_logging_handler.setLevel(logging.NOTSET)
# Basic config setup function
def set_logging_basic_config():
logging.basicConfig(
format="%(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
level=logging.NOTSET,
handlers=[cli_logging_handler],
)
# Function to set CLI handler log level
def set_cli_handler_level(level: Any):
cli_logging_handler.setLevel(level)
# Function to set logging level for multiple loggers
def set_logging_level(level: Any, loggers: list[logging.Logger] | None = None):
if loggers:
for logger in loggers:
logger.setLevel(level=level)
logging.basicConfig(level=level)
cli_logging_handler.setLevel(level)
# Function to set the custom formatter on a logger
def set_custom_formatter_on_logger(logger: logging.Logger):
# If no handlers exist, add the cli_logging_handler
if not logger.handlers:
logger.addHandler(cli_logging_handler)
# Now set the custom formatter for all handlers
for handler in logger.handlers:
handler.setFormatter(CustomFormatter())
# Prevent logger from propagating to the root logger (fixes double logging)
logger.propagate = False
logger.info(f"{CustomFormatter.__name__} set for {logger.name = }")
# Get the logger
logger = logging.getLogger(__name__)
# apply the custom formatter
set_custom_formatter_on_logger(logger=logger)
set_custom_formatter_on_logger(logging.getLogger())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment