import logging
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional


LOG_LEVEL = logging.DEBUG
LOG_FILE = Path("logs") / "application.log"
LOG_FORMAT = "%(asctime)s | %(name)s | %(levelname)-8s | [%(filename)s:%(lineno)d] | %(message)s"

def setup_logger(name: str = None, level: Optional[int] = logging.NOTSET) -> logging.Logger:
    logger = logging.getLogger(name or __name__)
    logger.setLevel(level)

    if not logger.handlers:
        # Console handler (stdout)
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(level)
        console_formatter = logging.Formatter(LOG_FORMAT)
        console_handler.setFormatter(console_formatter)

        # Verify log file path exist
        LOG_FILE.parent.mkdir(parents=True, exist_ok=True)

        # File handler with rotation (5MB per file, maintains 3 files)
        file_handler = RotatingFileHandler(LOG_FILE, maxBytes=5_242_880, backupCount=3, encoding="utf-8")
        file_handler.setLevel(level)
        file_formatter = logging.Formatter(LOG_FORMAT)
        file_handler.setFormatter(file_formatter)

        # Add handlers to the logger
        logger.addHandler(console_handler)
        logger.addHandler(file_handler)

        # Avoid propagating logs back to top twice
        logger.propagate = False

    return logger


logger = setup_logger("my_logger", LOG_LEVEL)

logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
logger.critical("Critical message")

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: