""" Structured logging configuration using structlog. إعداد السجلات المنظمة. """ from __future__ import annotations import logging import sys import structlog from core.config.settings import get_settings def configure_logging() -> None: """Configure structlog + stdlib logging | إعداد نظام السجلات.""" settings = get_settings() log_level = getattr(logging, settings.app_log_level, logging.INFO) logging.basicConfig( format="%(message)s", stream=sys.stdout, level=log_level, ) processors = [ structlog.contextvars.merge_contextvars, structlog.processors.add_log_level, structlog.processors.TimeStamper(fmt="iso", utc=True), structlog.processors.StackInfoRenderer(), structlog.processors.format_exc_info, ] if settings.is_production: processors.append(structlog.processors.JSONRenderer()) else: processors.append(structlog.dev.ConsoleRenderer(colors=True)) structlog.configure( processors=processors, # type: ignore[arg-type] wrapper_class=structlog.make_filtering_bound_logger(log_level), context_class=dict, logger_factory=structlog.PrintLoggerFactory(), cache_logger_on_first_use=True, ) def get_logger(name: str | None = None) -> structlog.BoundLogger: """Get a structlog logger.""" return structlog.get_logger(name)