MCPcopy Create free account
hub / github.com/Emmimal/control-layer / AuditLogger

Class AuditLogger

control_layer.py:698–777  ·  view source on GitHub ↗

Records every attempt with its failure mode, latency, and outcome. Production fix over v1: - Thread-safe writes via lock - Persistent JSONL file (survives restarts) - In-memory index for fast analytics - Each line is a valid JSON object (grep/jq friendly)

Source from the content-addressed store, hash-verified

696# =============================================================================
697
698class AuditLogger:
699 """
700 Records every attempt with its failure mode, latency, and outcome.
701
702 Production fix over v1:
703 - Thread-safe writes via lock
704 - Persistent JSONL file (survives restarts)
705 - In-memory index for fast analytics
706 - Each line is a valid JSON object (grep/jq friendly)
707 """
708
709 def __init__(self, log_path: str = "audit.jsonl"):
710 self._path = Path(log_path)
711 self._records: List[AuditRecord] = []
712 self._lock = threading.Lock()
713 # Load existing records on startup
714 self._load_existing()
715
716 def _load_existing(self) -> None:
717 if self._path.exists():
718 with self._lock:
719 try:
720 with open(self._path, "r", encoding="utf-8") as f:
721 for line in f:
722 line = line.strip()
723 if line:
724 # Reconstruct for in-memory analytics only
725 # Full record is in the file
726 pass
727 except Exception as exc:
728 log.warning("audit.load_failed", error=str(exc))
729
730 def log(self, record: AuditRecord) -> None:
731 with self._lock:
732 self._records.append(record)
733 try:
734 with open(self._path, "a", encoding="utf-8") as f:
735 f.write(json.dumps(record.to_dict()) + "\n")
736 except Exception as exc:
737 log.error("audit.write_failed", error=str(exc))
738
739 def all_records(self) -> List[AuditRecord]:
740 with self._lock:
741 return list(self._records)
742
743 def failure_distribution(self) -> Dict[str, int]:
744 with self._lock:
745 dist: Dict[str, int] = defaultdict(int)
746 for r in self._records:
747 dist[r.failure_mode.value] += 1
748 return dict(dist)
749
750 def retry_distribution(self) -> Dict[int, int]:
751 with self._lock:
752 dist: Dict[int, int] = defaultdict(int)
753 for r in self._records:
754 dist[r.attempt] += 1
755 return dict(dist)

Callers 6

test_log_and_retrieveMethod · 0.90
test_persists_to_fileMethod · 0.90
test_pass_rateMethod · 0.90
__init__Method · 0.85

Calls

no outgoing calls

Tested by 5

test_log_and_retrieveMethod · 0.72
test_persists_to_fileMethod · 0.72
test_pass_rateMethod · 0.72