Immutable audit logging for FastAPI — fire-and-forget event emission, pluggable writers, and a query API.
Project description
fastapi-fabric-audit
Immutable audit logging for FastAPI — fire-and-forget event emission, pluggable writers, and a query API.
Install
pip install fastapi-fabric[auth,audit]
Quick start
from fastapi_fabric.audit.protocol import set_writer
from fastapi_fabric.audit.writers.database import DatabaseAuditWriter
from fastapi_fabric.audit.writers.queued import QueuedAuditWriter
from fastapi_fabric.audit.writer import emit_audit
from sqlalchemy.ext.asyncio import async_sessionmaker
# Wire at startup
session_factory = async_sessionmaker(engine, expire_on_commit=False)
writer = QueuedAuditWriter(DatabaseAuditWriter(session_factory))
set_writer(writer)
await writer.start()
# Emit in a route (fire-and-forget — not awaited, scheduled via BackgroundTasks)
@app.post("/posts")
async def create_post(background_tasks: BackgroundTasks, principal = Depends(get_current_principal)):
post = await do_create()
emit_audit(
background_tasks,
action="post.created",
principal=principal,
resource_type="post",
resource_id=str(post.id),
)
return post
# Flush on shutdown
await writer.flush()
Router
from fastapi_fabric.audit import create_audit_router
app.include_router(create_audit_router())
| Method | Path | Description |
|---|---|---|
GET |
/api/v1/audit |
Query audit events (audit:read) |
GET |
/api/v1/audit/{id} |
Get single event (audit:read) |
Filter params: actor_id, actor_type, action (prefix with . for prefix match), resource_type, resource_id, from, to, has_flag.
Writers
File writer
Appends one JSON line per event to a daily-rotating file:
from fastapi_fabric.audit.writers.file import FileAuditWriter
set_writer(FileAuditWriter("logs/audit.jsonl", backup_count=90))
Database writer
Inserts into the audit_events table:
from fastapi_fabric.audit.writers.database import DatabaseAuditWriter
set_writer(DatabaseAuditWriter(session_factory, retention_days=30))
Purges events older than retention_days at startup.
Queued writer
Wraps any writer with an async queue to decouple writes from the request path:
from fastapi_fabric.audit.writers.queued import QueuedAuditWriter
writer = QueuedAuditWriter(inner_writer, maxsize=10000)
await writer.start() # call at app startup
await writer.flush() # call at app shutdown
Composite writer
Fans out to multiple writers simultaneously. One failing does not stop the others:
from fastapi_fabric.audit.writers.composite import CompositeAuditWriter
set_writer(QueuedAuditWriter(
CompositeAuditWriter([
FileAuditWriter("logs/audit.jsonl"),
DatabaseAuditWriter(session_factory),
])
))
Emit API
Neither function is awaited — both schedule the write and return immediately, so they never add latency to the response path.
from fastapi_fabric.audit.writer import emit_audit, emit_audit_nowait
# With BackgroundTasks (recommended in routes)
emit_audit(background_tasks, action="user.deactivated", principal=principal,
resource_type="user", resource_id=user_id)
# Without BackgroundTasks (e.g. in background jobs) — schedules an asyncio task
emit_audit_nowait(action="job.completed", principal=None, detail={"job_id": jid})
Actor fields (id, type, email, name, flags) are automatically populated from principal.
Config reference
audit:
db_retention_days: 30 # events older than this are purged at startup
queue_maxsize: 10000 # drops events (with warning) when full
log_file: logs/audit.jsonl # path for FileAuditWriter
log_retention_days: 90 # rotated file backups to keep
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_fabric_audit-0.1.0.tar.gz.
File metadata
- Download URL: fastapi_fabric_audit-0.1.0.tar.gz
- Upload date:
- Size: 11.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8661f0f816eede7cb4fa604fdce7144e144a5e138cbb07334eb10d929de9ef95
|
|
| MD5 |
144530330b627778b674b437b48c4d7d
|
|
| BLAKE2b-256 |
251c5fc555b1fc6f210a9188e0ae459a30a6a51b39684c9640c1388f0ff50400
|
File details
Details for the file fastapi_fabric_audit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fastapi_fabric_audit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35a3f6febf49a1f386c808a9d64bd6055a5e7985d654fbd8001a6195ad0f4bd8
|
|
| MD5 |
a7fc2fb78df2bb2016d09bf946928909
|
|
| BLAKE2b-256 |
79ecc5e896b583fa64d935c25127a3c59cd03589769902cdcef0f9f36eb5b0ae
|