thereisnohr / src /core /logging.py
jbeiroa's picture
Initial clean deploy of demo app
74711df
"""Core runtime utilities shared across CLI, API, and pipeline modules."""
import logging
import uuid
class RunIDFilter(logging.Filter):
"""Adds a default run_id to records if missing."""
def filter(self, record):
if not hasattr(record, "run_id"):
record.run_id = "global"
return True
def configure_logging(level: str = "INFO") -> None:
"""Runs configure logging logic.
Args:
level (str): Input value used by `level`.
"""
handler = logging.StreamHandler()
handler.setFormatter(
logging.Formatter("%(asctime)s %(levelname)s run_id=%(run_id)s %(name)s %(message)s")
)
handler.addFilter(RunIDFilter())
root = logging.getLogger()
root.setLevel(level.upper())
# Clear existing handlers
for h in root.handlers[:]:
root.removeHandler(h)
root.addHandler(handler)
class RunLoggerAdapter(logging.LoggerAdapter):
"""Data model for runloggeradapter values."""
def process(self, msg, kwargs):
"""Runs process logic.
Args:
msg (Any): Input value used by `msg`.
kwargs (Any): Input value used by `kwargs`.
"""
extra = kwargs.setdefault("extra", {})
extra.setdefault("run_id", self.extra.get("run_id"))
return msg, kwargs
def get_run_logger(name: str) -> RunLoggerAdapter:
"""Fetches a record or value needed by downstream workflow steps.
Args:
name (str): Candidate name value to persist or score.
Returns:
RunLoggerAdapter: Return value for this function.
"""
run_id = uuid.uuid4().hex[:12]
return RunLoggerAdapter(logging.getLogger(name), {"run_id": run_id})