# logger_config.py import logging import os class RelativePathFormatter(logging.Formatter): def format(self, record): record.relpath = os.path.relpath(record.pathname, os.getcwd()) return super().format(record) def setup_loggers(): os.makedirs("logs", exist_ok=True) # === Format === # formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(name)s | %(message)s") formatter = RelativePathFormatter("%(asctime)s | %(levelname)s | %(name)s | %(relpath)s:%(lineno)d | %(message)s") # === App Logger === app_logger = logging.getLogger("app_logger") app_handler = logging.FileHandler("logs/app.log") app_handler.setLevel(logging.INFO) app_handler.setFormatter(formatter) app_logger.setLevel(logging.INFO) app_logger.addHandler(app_handler) # === Error Logger === error_logger = logging.getLogger("error_logger") error_handler = logging.FileHandler("logs/errors.log") error_handler.setLevel(logging.ERROR) error_handler.setFormatter(formatter) error_logger.setLevel(logging.ERROR) error_logger.addHandler(error_handler) # === Access Logger === (optional for request logs) access_logger = logging.getLogger("access_logger") access_handler = logging.FileHandler("logs/access.log") access_handler.setLevel(logging.INFO) access_handler.setFormatter(formatter) access_logger.setLevel(logging.INFO) access_logger.addHandler(access_handler) # === Warning Logger === warning_logger = logging.getLogger("warning_logger") warning_handler = logging.FileHandler("logs/warnings.log") warning_handler.setLevel(logging.WARNING) # WARNING, ERROR, CRITICAL warning_handler.setFormatter(formatter) warning_logger.setLevel(logging.WARNING) warning_logger.addHandler(warning_handler) # Optional: also log to console console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) app_logger.addHandler(console_handler) error_logger.addHandler(console_handler) access_logger.addHandler(console_handler) warning_logger.addHandler(console_handler)