import os import logging from logging.handlers import RotatingFileHandler from flask import request, session, has_request_context class RequestContextFilter(logging.Filter): def filter(self, record): if has_request_context(): record.user = session.get("user_email", "Anonymous") record.ip = request.remote_addr record.method = request.method record.url = request.url else: record.user = "System" record.ip = "N/A" record.method = "N/A" record.url = "N/A" return True class LoggerService: @staticmethod def init_app(app): if not os.path.exists("logs"): os.makedirs("logs") formatter = logging.Formatter( "%(asctime)s | %(levelname)s | " "User:%(user)s | IP:%(ip)s | " "Method:%(method)s | URL:%(url)s | " "%(message)s" ) # INFO LOG info_handler = RotatingFileHandler( "logs/app.log", maxBytes=5 * 1024 * 1024, backupCount=5 ) info_handler.setLevel(logging.INFO) info_handler.setFormatter(formatter) # ERROR LOG error_handler = RotatingFileHandler( "logs/error.log", maxBytes=5 * 1024 * 1024, backupCount=5 ) error_handler.setLevel(logging.ERROR) error_handler.setFormatter(formatter) # CONSOLE console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(formatter) # 🔹 ADD FILTER (important) context_filter = RequestContextFilter() info_handler.addFilter(context_filter) error_handler.addFilter(context_filter) console_handler.addFilter(context_filter) app.logger.setLevel(logging.DEBUG) app.logger.addHandler(info_handler) app.logger.addHandler(error_handler) app.logger.addHandler(console_handler) # Log every request automatically @app.before_request def log_request(): app.logger.info("Request Started")