"""Audit-Log: eine JSON-Zeile je Tool-Aufruf auf stdout (für das Log-System des Clusters). Enthält Client (Name des Schlüssels), Datenbank (ohne Passwort), Tool, Abfrage, Zeilenzahl, Dauer und Ergebnis. Zugangsdaten stehen nie im Log. """ import json import logging import sys import time from typing import Any log = logging.getLogger("dbmcp.audit") SQL_CHARS = 2000 def setup() -> None: if not log.handlers: handler = logging.StreamHandler(sys.stdout) handler.setFormatter(logging.Formatter("%(message)s")) log.addHandler(handler) log.setLevel(logging.INFO) log.propagate = False def record(**fields: Any) -> None: if "sql" in fields and fields["sql"]: fields["sql"] = fields["sql"][:SQL_CHARS] log.info(json.dumps({"ts": round(time.time(), 3), "event": "dbmcp.call", **fields}, ensure_ascii=False, default=str))