robonix_api.scribe_logger

scribe_logger — Python-side unified logging facade.

Mirrors system/scribe/src/lib.rs semantics: single log() entry point, lazy init, dual sink (stderr + per-tag JSON-lines file).

Usage:

from robonix_api import scribe_logger

scribe_logger.info("atlas", "control plane ready")
scribe_logger.log(scribe_logger.Level.WARN, "my_driver", "sensor timeout")

Functions

debug(tag, msg)

Convenience: Level.DEBUG.

error(tag, msg)

Convenience: Level.ERROR.

info(tag, msg)

Convenience: Level.INFO.

install_stdlib_bridge(tag, *[, level, ...])

Route stdlib logging through Scribe so packages need no own sink.

log(level, tag, msg)

Log one record — the only entry point.

warn(tag, msg)

Convenience: Level.WARN.

Classes

Level(*values)

Severity, ordered DEBUG < INFO < WARN < ERROR.

class robonix_api.scribe_logger.Level(*values)[source]

Bases: Enum

Severity, ordered DEBUG < INFO < WARN < ERROR.

DEBUG = 'D'
ERROR = 'E'
INFO = 'I'
WARN = 'W'
robonix_api.scribe_logger.debug(tag: str, msg: str) None[source]

Convenience: Level.DEBUG.

robonix_api.scribe_logger.error(tag: str, msg: str) None[source]

Convenience: Level.ERROR.

robonix_api.scribe_logger.info(tag: str, msg: str) None[source]

Convenience: Level.INFO.

robonix_api.scribe_logger.install_stdlib_bridge(tag: str, *, level: int = 20, logger: Logger | None = None, replace_existing_handlers: bool = True) Logger[source]

Route stdlib logging through Scribe so packages need no own sink.

Attaches a _StdlibBridgeHandler (tagged tag) to logger (the root logger by default, so transitive-dependency logs are captured too) and raises its level to level. When replace_existing_handlers is true, every other handler already on that logger — StreamHandler (stdout/ stderr), FileHandler (a per-package log file), a rich handler from fastmcp/uvicorn, anything — is removed first, so the bridge is the only sink. This enforces the repo rule “no package owns a log file or duplicate stdout sink; everything goes through Scribe” (Scribe already mirrors to stderr itself, so console output is not lost).

Idempotent and re-taggable: exactly one bridge handler ever exists on the logger, and the most recent call’s tag wins (so the framework can re-tag with the provider id at bootstrap after a package set a provisional tag at import). Returns the configured logger.

robonix_api.scribe_logger.log(level: Level, tag: str, msg: str) None[source]

Log one record — the only entry point.

The first call transparently creates $SCRIBE_LOG_DIR (default ./logs). Errors are best-effort (stderr / disk full are silently ignored).

robonix_api.scribe_logger.warn(tag: str, msg: str) None[source]

Convenience: Level.WARN.