Source code for app.core.logging
"""
Structured logging setup using structlog.
Outputs JSON in production, colored console in development.
"""
import logging
import sys
import structlog
from app.config import get_settings
[docs]
def setup_logging() -> None:
settings = get_settings()
log_level = getattr(logging, settings.log_level.upper(), logging.INFO)
# Configure stdlib logging basicConfig first so handlers are set up
logging.basicConfig(
format="%(message)s",
stream=sys.stdout,
level=log_level,
)
shared_processors = [
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
]
if settings.is_development:
# Pretty console output for local dev
processors = shared_processors + [
structlog.dev.ConsoleRenderer(colors=True),
]
else:
# JSON output for production log aggregators (Datadog, CloudWatch, etc.)
processors = shared_processors + [
structlog.processors.dict_tracebacks,
structlog.processors.JSONRenderer(),
]
structlog.configure(
processors=processors,
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
[docs]
def get_logger(name: str = __name__) -> structlog.BoundLogger:
return structlog.get_logger(name)