Files
3cloud-backend/logger.py
T

63 lines
1.7 KiB
Python

import logging
from colorlog import ColoredFormatter
import os
class RequestFilter(logging.Filter):
"""Custom filter to add request_id from Flask's g object when available"""
def filter(self, record):
record.funcName = record.funcName if hasattr(record, 'funcName') else '<unknown>'
# Initialize request_id with default value
record.request_id = 'no-context'
# Try to get Flask's g object only when needed
try:
from flask import g
if hasattr(g, 'request_id'):
record.request_id = g.request_id
except RuntimeError: # Outside of application context
pass
except ImportError: # Flask not available
pass
return True
# Define the log format with request_id
log_format = (
"%(log_color)s%(asctime)s - %(levelname)s - RequestID:[%(request_id)s] - %(funcName)s - %(message)s"
)
date_format = "%Y-%m-%d %H:%M:%S"
# Configure the formatter with colors
formatter = ColoredFormatter(
log_format,
datefmt=date_format,
log_colors={
"DEBUG": "cyan",
"INFO": "green",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "bold_red",
},
)
# Configure the handler
handler = logging.StreamHandler()
handler.setFormatter(formatter)
# Configure the logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addFilter(RequestFilter())
logger.addHandler(handler)
# Ensure the logs directory exists
log_dir = "logs"
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# Configure the file handler
file_handler = logging.FileHandler("logs/app.log")
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.WARNING)
logger.addHandler(file_handler)