Source code for lalandre_core.logging_setup

"""Shared logging configuration for Lalandre workers."""

import logging
import os
import sys

import structlog


[docs] def setup_worker_logging() -> None: """Configure root logging with structlog. Reads LOG_FORMAT env var: 'json' for structured JSON output, anything else for human-readable console output. """ use_json = os.environ.get("LOG_FORMAT", "").lower() == "json" shared_processors: list[structlog.types.Processor] = [ structlog.contextvars.merge_contextvars, structlog.stdlib.add_log_level, structlog.stdlib.add_logger_name, structlog.processors.TimeStamper(fmt="%Y-%m-%dT%H:%M:%S", utc=False), structlog.processors.StackInfoRenderer(), structlog.processors.format_exc_info, ] if use_json: renderer: structlog.types.Processor = structlog.processors.JSONRenderer( ensure_ascii=False, ) else: renderer = structlog.dev.ConsoleRenderer() structlog.configure( processors=[ *shared_processors, structlog.stdlib.ProcessorFormatter.wrap_for_formatter, ], logger_factory=structlog.stdlib.LoggerFactory(), wrapper_class=structlog.stdlib.BoundLogger, cache_logger_on_first_use=True, ) formatter = structlog.stdlib.ProcessorFormatter( processors=[ structlog.stdlib.ProcessorFormatter.remove_processors_meta, renderer, ], ) handler = logging.StreamHandler(sys.stderr) handler.setFormatter(formatter) root = logging.getLogger() root.setLevel(logging.INFO) root.handlers.clear() root.addHandler(handler)