todo-fastapi / utils /logging_config.py
MuhammedSuhaib's picture
Deployment via uv
808e55f verified
Raw
History Blame Contribute Delete
1.57 kB
import logging
import sys
from pythonjsonlogger import jsonlogger
import os
from datetime import datetime
def setup_logging():
"""Setup structured logging for the application"""
# Get log level from environment, default to INFO
log_level = os.getenv('LOG_LEVEL', 'INFO').upper()
# Create a custom JSON formatter
json_formatter = jsonlogger.JsonFormatter(
'%(asctime)s %(name)s %(levelname)s %(filename)s %(lineno)d %(message)s',
datefmt='%Y-%m-%dT%H:%M:%S'
)
# Setup root logger
root_logger = logging.getLogger()
root_logger.setLevel(getattr(logging, log_level))
# Clear any existing handlers
root_logger.handlers.clear()
# Create handler for stdout
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(json_formatter)
root_logger.addHandler(handler)
# Also setup specific loggers for different components
logging.getLogger('uvicorn').setLevel(getattr(logging, log_level))
logging.getLogger('uvicorn.access').setLevel(getattr(logging, log_level))
logging.getLogger('uvicorn.error').setLevel(getattr(logging, log_level))
logging.getLogger('fastapi').setLevel(getattr(logging, log_level))
logging.getLogger('sqlalchemy').setLevel(logging.WARNING) # Reduce SQLAlchemy noise
logging.getLogger('confluent_kafka').setLevel(getattr(logging, log_level))
def get_logger(name: str) -> logging.Logger:
"""Get a logger instance with the specified name"""
return logging.getLogger(name)
# Initialize logging when module is imported
setup_logging()