79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
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") |