Created
September 10, 2024 20:44
-
-
Save VietThan/399de00657583c197df50091102a5e32 to your computer and use it in GitHub Desktop.
logger with custom format
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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