63 lines
1.7 KiB
Python
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) |