Expand description
Structured audit log middleware for Axum — records every request/response cycle.
A Tower Layer that captures method, path, query string, client IP,
user-agent, HTTP status code, and wall-clock latency for every request,
then delivers the data to a configurable sink. The inner service and its
response are returned unchanged; auditing is purely observational.
§Features
AuditEvent— a plain struct capturing one request/response cycle.AuditSinktrait — implement any destination: file, channel, database, SIEM.StdoutSink/StderrSink— print structured lines to standard streams.NullSink— discard all events; useful for tests and benchmarks.CallbackSink— drive any closure; useful for custom aggregation.AuditLayer— Tower layer; apply with.layer()on any Axum [Router].
§Quick Start
use axum::{routing::get, Router};
use rune_axum_audit::AuditLayer;
let app: Router = Router::new()
.route("/api", get(|| async { "ok" }))
.layer(AuditLayer::stdout());§Custom sink
use std::sync::{Arc, Mutex};
use axum::{routing::get, Router};
use rune_axum_audit::{AuditEvent, AuditLayer, CallbackSink};
let events: Arc<Mutex<Vec<AuditEvent>>> = Arc::new(Mutex::new(Vec::new()));
let captured = Arc::clone(&events);
let app: Router = Router::new()
.route("/api", get(|| async { "ok" }))
.layer(AuditLayer::new(CallbackSink::new(move |event| {
captured.lock().unwrap().push(event);
})));Structs§
- Audit
Event - A single captured request/response audit record.
- Audit
Future - Future returned by
AuditService. - Audit
Layer - Tower
Layerthat records oneAuditEventper request to the configuredAuditSink. - Audit
Service - Tower
Serviceproduced byAuditLayer. - Callback
Sink AuditSinkbacked by a closure.- Null
Sink AuditSinkthat silently discards everyAuditEvent.- Stderr
Sink AuditSinkthat prints eachAuditEventto standard error.- Stdout
Sink AuditSinkthat prints eachAuditEventto standard output.
Traits§
- Audit
Sink - The delivery interface for
AuditEventrecords.