utility_logs
Thu Sep 26 2024 12:02:41 GMT+0000 (Coordinated Universal Time)
Saved by @CarlosR
#APP
import logging
import sys
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from routers import add_routers
from models.ireg_agent.utility_logging import set_request_id, get_logger, RequestIdFilter, patch_logger
import uuid
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - [%(request_id)s] - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logging.getLogger().addFilter(RequestIdFilter())
root_logger = logging.getLogger()
root_logger.addFilter(RequestIdFilter())
# Patch commonly used libraries
patch_logger('requests')
patch_logger('urllib3')
# patch_logger('uvicorn')
# patch_logger('uvicorn.access')
# patch_logger('urllib3')
from config import settings
# Set global logging options
if settings.log_level.lower() == 'critical':
root_logger.setLevel(logging.CRITICAL)
elif settings.log_level.lower() in ('warn', 'warning'):
root_logger.setLevel(logging.WARNING)
elif settings.log_level.lower() == 'debug':
root_logger.setLevel(logging.DEBUG)
else:
root_logger.setLevel(logging.INFO)
get_logger("httpcore").setLevel(logging.WARNING)
get_logger("httpx").setLevel(logging.WARNING)
# Initialize Application
app = FastAPI()
# Configure CORS
allowed_cors_origins = ['*']
app.add_middleware(
CORSMiddleware,
allow_origins=allowed_cors_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.middleware("http")
async def add_request_id(request: Request, call_next):
request_id = str(uuid.uuid4())
set_request_id(request_id)
response = await call_next(request)
return response
# Add our routers
add_routers(app)
#####Utility login g
import contextvars
import logging
import uuid
request_id_var = contextvars.ContextVar('request_id', default=None)
class RequestIdFilter(logging.Filter):
def filter(self, record):
request_id = request_id_var.get()
if request_id is None:
request_id = str(uuid.uuid4())
request_id_var.set(request_id)
record.request_id = request_id
return True
def get_logger(name):
logger = logging.getLogger(name)
if not any(isinstance(f, RequestIdFilter) for f in logger.filters):
logger.addFilter(RequestIdFilter())
return logger
def set_request_id(request_id=None):
if request_id is None:
request_id = str(uuid.uuid4())
request_id_var.set(request_id)
def get_request_id():
return request_id_var.get()
def patch_logger(logger_name):
logger = logging.getLogger(logger_name)
if not any(isinstance(f, RequestIdFilter) for f in logger.filters):
logger.addFilter(RequestIdFilter())
for handler in logger.handlers:
if isinstance(handler, logging.StreamHandler):
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - [%(request_id)s] - %(levelname)s - %(message)s'))
# # script1.py
# from shared_logging import get_logger
# logger = get_logger(__name__)
# def do_something():
# logger.info("Doing something in script1")
# # Your logic here
# # script2.py
# from shared_logging import get_logger
# logger = get_logger(__name__)
# def do_something_else():
# logger.info("Doing something else in script2")
# # Your logic here
# # script3.py
# from shared_logging import get_logger
# logger = get_logger(__name__)
# def final_operation():
# logger.info("Performing final operation in script3")
# # Your logic here
# return "Operation complete"
# import logging
# logging.basicConfig(
# level=logging.INFO,
# format='%(asctime)s - %(name)s - [%(request_id)s] - %(levelname)s - %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S'
# )
# 2023-05-20 10:15:30 - main_api - [123e4567-e89b-12d3-a456-426614174000] - INFO - Received request
# 2023-05-20 10:15:30 - script1 - [123e4567-e89b-12d3-a456-426614174000] - INFO -
# Add Error Handling:
# Wrap the context management in a try-except block to ensure the request ID is always reset, even if an error occurs:
# @app.middleware("http")
# async def add_request_id(request: Request, call_next):
# request_id = generate_request_id()
# token = request_id_var.set(request_id)
# try:
# response = await call_next(request)
# return response
# finally:
# request_id_var.reset(token)



Comments