# # 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)