78 lines
2 KiB
Python
78 lines
2 KiB
Python
# logging_config.py
|
|
|
|
|
|
import logging
|
|
|
|
from fastapi_dynamic_response.settings import Settings
|
|
import structlog
|
|
|
|
logger = structlog.get_logger()
|
|
|
|
|
|
def configure_logging_two():
|
|
settings = Settings()
|
|
|
|
# Clear existing loggers
|
|
logging.config.dictConfig(
|
|
{
|
|
"version": 1,
|
|
"disable_existing_loggers": False,
|
|
}
|
|
)
|
|
|
|
if settings.ENV == "local":
|
|
# Local development logging configuration
|
|
processors = [
|
|
# structlog.processors.TimeStamper(fmt="iso"),
|
|
structlog.dev.ConsoleRenderer(colors=False),
|
|
]
|
|
logging_level = logging.DEBUG
|
|
|
|
# Enable rich tracebacks
|
|
from rich.traceback import install
|
|
|
|
install(show_locals=True)
|
|
|
|
# Use RichHandler for pretty console logs
|
|
from rich.logging import RichHandler
|
|
|
|
logging.basicConfig(
|
|
level=logging_level,
|
|
format="%(message)s",
|
|
datefmt="[%X]",
|
|
handlers=[RichHandler()],
|
|
)
|
|
else:
|
|
# Production logging configuration
|
|
processors = [
|
|
structlog.processors.TimeStamper(fmt="iso"),
|
|
structlog.processors.JSONRenderer(),
|
|
]
|
|
logging_level = logging.INFO
|
|
|
|
# Standard logging configuration
|
|
logging.basicConfig(
|
|
format="%(message)s",
|
|
level=logging_level,
|
|
handlers=[logging.StreamHandler()],
|
|
)
|
|
|
|
structlog.configure(
|
|
processors=processors,
|
|
wrapper_class=structlog.make_filtering_bound_logger(logging_level),
|
|
context_class=dict,
|
|
logger_factory=structlog.stdlib.LoggerFactory(),
|
|
cache_logger_on_first_use=True,
|
|
)
|
|
|
|
# Redirect uvicorn loggers to structlog
|
|
for logger_name in ("uvicorn", "uvicorn.error", "uvicorn.access"):
|
|
logger = logging.getLogger(logger_name)
|
|
logger.handlers = []
|
|
logger.propagate = True
|
|
|
|
logger.info("Logging configured")
|
|
logger.info(f"Environment: {settings.ENV}")
|
|
|
|
|
|
configure_logging = configure_logging_two
|