2025年06月26日

python logging

import logging
import sys
import warnings

FORMAT: str = "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)d] - %(message)s"

def handle_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return
    logger = logging.getLogger("UncaughtException")
    logger.critical("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))

def handle_warning(message, category, filename, lineno, file=None, line=None):
    logger = logging.getLogger("Warnings")
    logger.warning(f"{filename}:{lineno}: {category.__name__}: {message}")


def setup(level=logging.INFO):
    sys.excepthook = handle_exception
    warnings.showwarning = handle_warning

    logger = logging.getLogger()
    logger.setLevel(level)

    for handler in logger.handlers[:]:
        logger.removeHandler(handler)

    formatter = logging.Formatter(FORMAT, datefmt="%Y-%m-%d %H:%M:%S")

    console_handler = logging.StreamHandler()
    console_handler.setLevel(level)
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)