Log HTTP requests

This commit is contained in:
Antoine Gersant 2025-01-12 20:38:32 -08:00
parent 00236a99e3
commit 2521ff1ddf
2 changed files with 63 additions and 1 deletions
src/server

View file

@ -11,6 +11,7 @@ use crate::app::{self, App};
mod api;
mod auth;
mod error;
mod logger;
mod version;
#[cfg(test)]
@ -27,7 +28,8 @@ pub fn make_router(app: App) -> NormalizePath<Router> {
.nest("/api", api::router())
.with_state(app.clone())
.nest_service("/swagger", swagger)
.nest("/", static_files);
.nest("/", static_files)
.layer(logger::LogLayer::new());
NormalizePathLayer::trim_trailing_slash().layer(router)
}

60
src/server/axum/logger.rs Normal file
View file

@ -0,0 +1,60 @@
use axum::{extract::Request, response::Response};
use log::{log, Level};
use std::{
future::Future,
pin::Pin,
task::{Context, Poll},
};
use tower::{Layer, Service};
#[derive(Clone)]
pub struct LogLayer;
impl LogLayer {
pub fn new() -> Self {
Self {}
}
}
impl<S> Layer<S> for LogLayer {
type Service = LogMiddleware<S>;
fn layer(&self, inner: S) -> Self::Service {
LogMiddleware { inner }
}
}
#[derive(Clone)]
pub struct LogMiddleware<S> {
inner: S,
}
impl<S> Service<Request> for LogMiddleware<S>
where
S: Service<Request, Response = Response> + Send + 'static,
S::Future: Send + 'static,
{
type Response = S::Response;
type Error = S::Error;
type Future =
Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send + 'static>>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
self.inner.poll_ready(cx)
}
fn call(&mut self, request: Request) -> Self::Future {
let uri = request.uri().clone();
let future = self.inner.call(request);
Box::pin(async move {
let response: Response = future.await?;
let level = if response.status().is_success() {
Level::Info
} else {
Level::Error
};
log!(level, "[{}] {}", response.status(), uri);
Ok(response)
})
}
}