Overview
Audit Logs in Bifrost Enterprise record administrative activity so operators can review who changed what, when it happened, and which resource was affected. Audit log entries can be signed with an HMAC key, retained for a configurable number of days, viewed in the dashboard, and exported for downstream review.
Key Features
Configuration
Configuration Fields
Viewing Audit Logs
Open Governance > Audit Logs in the Bifrost dashboard. The table shows:
You can search by initiator, target, IP, or path, and filter by action, outcome, start date, and end date.
Exporting Audit Logs
Users withAuditLogs:Download permission can export the currently filtered audit log results from the dashboard.
Supported export formats:
Archiving to Object Storage
By default, audit events live only in the database, which is the source of truth for everything you see in the dashboard (viewing, filtering, HMAC verification, and export). Databases, however, are not ideal for multi-year compliance retention or off-box durability. When you configureobject_storage, Bifrost additionally writes every audit event to an S3-compatible bucket (S3, GCS, MinIO, R2) as it is recorded. This is a dual-write, not an offload: the full event goes to both the database and object storage, so each store holds a complete, independent copy.
This differs from Log Exports, where object storage offloads the heavy request/response payload out of the database. For audit logs, object storage is a complete mirror — the database is never trimmed of data by enabling it.
Database vs. Object Storage
Because the two are decoupled, the archive can outlive the database: once
retention_days deletes an old row, its object in the bucket is left untouched. Use S3 Object Lock / WORM and bucket lifecycle rules to govern how long the archive is kept.
How Archival Works
Audit events are written in small batches (buffered and flushed together). Each flushed batch becomes one gzipped JSON Lines object, written after the database write succeeds. The object key is time-partitioned:"prefix": "acme-prod" and "compress": true:
Archival is best-effort, not guaranteed. The upload happens synchronously within the flush and audit batches are never dropped under back-pressure. If an upload fails, the error is logged but the flush still succeeds — the database already holds the record and remains the source of truth, but that batch will be missing from the bucket, and nothing blocks request handling. Treat object storage as a complete compliance mirror only if you monitor upload failures and replay any missed batches; the database, not the archive, is authoritative.
Configuration
- S3 / MinIO / R2
- GCS
Object Storage Fields
You can point audit archival at its own dedicated (ideally write-once/locked) bucket, or reuse the same bucket as request
logs_store with a distinct prefix. The audit-logs/ path segment keeps the two from overlapping.
