Source code for fabex.utilities.logging_utils

"""Fabex 'logging_utils.py' © 2025"""

import logging
from datetime import UTC, datetime
from pathlib import Path

[docs] LOG_WIDTH = 60
[docs] class ConsoleFormatter(logging.Formatter):
[docs] def format(self, record): if ":" in str(record.msg): record.msg = record.msg.split(":") record.msg = f"{record.msg[0]:>28}:{record.msg[1]:<30}" return super().format(record)
[docs] def heading(text): border = int((LOG_WIDTH - len(text) - 4) / 2) * "~" text = f"\n[{border} {text} {border}]" if len(text) == 60: text = text.replace("~]", "~~]") return text
[docs] current_time = datetime.now(tz=UTC).strftime("%Y%m%d_%H%M%S")
[docs] log = logging.getLogger("fabex_logger")
log.setLevel(logging.DEBUG) # Create file handler for logging
[docs] log_folder = Path(__file__).parent.parent / "logs"
log_folder.mkdir(parents=True, exist_ok=True)
[docs] log_path = Path(log_folder, f"{current_time}.log")
[docs] file_handler = logging.FileHandler(log_path)
file_handler.setLevel(logging.DEBUG) # Create another file handler for error logging
[docs] error_log_folder = Path(__file__).parent.parent / "logs"
error_log_folder.mkdir(parents=True, exist_ok=True)
[docs] error_log_path = Path(error_log_folder, f"Error_{current_time}.log")
[docs] error_handler = logging.FileHandler(error_log_path)
error_handler.setLevel(logging.ERROR) # Create another file handler for test logging
[docs] test_log_folder = Path(__file__).parent.parent / "logs"
test_log_folder.mkdir(parents=True, exist_ok=True)
[docs] test_log_path = Path(error_log_folder, f"Test_{current_time}.log")
[docs] test_handler = logging.FileHandler(error_log_path)
test_handler.setLevel(logging.ERROR) # Create console handler to pass messages to console
[docs] console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # Define custom format for the log messages
[docs] file_formatter = logging.Formatter( "%(asctime)s | %(levelname)8s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", )
error_formatter = test_formatter = logging.Formatter( "%(asctime)s | %(levelname)s: %(message)s | File '%(pathname)s', line %(lineno)d in %(funcName)s", datefmt="%Y-%m-%d %H:%M:%S", )
[docs] console_formatter = ConsoleFormatter( "%(message)s", )
file_handler.setFormatter(file_formatter) error_handler.setFormatter(error_formatter) test_handler.setFormatter(test_formatter) console_handler.setFormatter(console_formatter) # Adding handlers to the logger log.addHandler(file_handler) log.addHandler(error_handler) log.addHandler(test_handler) log.addHandler(console_handler)