Source code for sqlspec.observability._formatting

"""Formatters for standardized SQLSpec observability logs."""

import logging
from logging import LogRecord
from typing import Any

from sqlspec.utils.logging import StructuredFormatter

__all__ = ("OTelConsoleFormatter", "OTelJSONFormatter")


[docs] class OTelConsoleFormatter(logging.Formatter): """Console formatter that orders OTel-aligned fields consistently."""
[docs] def __init__(self, datefmt: str | None = None) -> None: super().__init__(datefmt=datefmt) self._field_order = ( "db.system", "db.operation", "trace_id", "span_id", "correlation_id", "duration_ms", "rows_affected", "execution_mode", "is_many", "is_script", "sqlspec.driver", "sqlspec.bind_key", "sqlspec.transaction_state", "sqlspec.prepared_statement", "db.statement", "db.statement.truncated", "db.statement.length", "db.statement.preview_length", "db.statement.hash", )
[docs] def format(self, record: LogRecord) -> str: timestamp = self.formatTime(record, self.datefmt) parts = [timestamp, f"[{record.levelname}]", record.getMessage()] record_dict = record.__dict__ parts.extend( self._format_field(key, record_dict[key]) for key in self._field_order if key in record_dict and record_dict[key] is not None ) return " ".join(parts)
@staticmethod def _format_field(key: str, value: Any) -> str: if isinstance(value, bool): return f"{key}={str(value).lower()}" return f"{key}={value}"
[docs] class OTelJSONFormatter(StructuredFormatter): """Structured JSON formatter for OTel-aligned log fields."""