use axum::{extract::Request, middleware::Next, response::Response};
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Instant;
const HEALTH_PATH: &str = "/api/v1/health";
static REQUEST_COUNTER: AtomicU64 = AtomicU64::new(0);
pub async fn logger(req: Request, next: Next) -> Response {
let id = REQUEST_COUNTER.fetch_add(1, Ordering::Relaxed);
let method = req.method().clone();
let path = req.uri().path().to_string();
let level = if path == HEALTH_PATH {
log::Level::Debug
} else {
log::Level::Info
};
log::log!(level, "[{id:08x}] <- {method} {path}");
let start = Instant::now();
let res = next.run(req).await;
let status = res.status();
let elapsed = start.elapsed().as_millis();
log::log!(level, "[{id:08x}] -> {status} {path} in {elapsed}ms");
res
}
#[cfg(test)]
#[path = "logger_tests.rs"]
mod logger_tests;