29 lines
796 B
Python
29 lines
796 B
Python
"""Structured logging utility — eliminates boilerplate across domain services."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import Any
|
|
|
|
|
|
def structured_log(
|
|
logger: logging.Logger,
|
|
level: str,
|
|
event: str,
|
|
/,
|
|
**fields: Any,
|
|
) -> None:
|
|
"""Emit a structured log entry.
|
|
|
|
The event name is passed as the log message. The JsonLogFormatter in
|
|
logging_config.py extracts it via record.getMessage() when no explicit
|
|
'event' key exists in extra — so we do NOT duplicate it.
|
|
|
|
Usage:
|
|
structured_log(logger, "info", "ingestion.run_started", user_id=1, scholar_count=5)
|
|
"""
|
|
fields.pop("metric_name", None)
|
|
fields.pop("metric_value", None)
|
|
|
|
log_method = getattr(logger, level.lower())
|
|
log_method(event, extra=fields)
|