30 lines
909 B
Python
30 lines
909 B
Python
"""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))
|