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")
To embed this project on your website, copy the following code and paste it into your website's HTML: