Log HTTP requests
This commit is contained in:
parent
00236a99e3
commit
2521ff1ddf
2 changed files with 63 additions and 1 deletions
|
@ -11,6 +11,7 @@ use crate::app::{self, App};
|
||||||
mod api;
|
mod api;
|
||||||
mod auth;
|
mod auth;
|
||||||
mod error;
|
mod error;
|
||||||
|
mod logger;
|
||||||
mod version;
|
mod version;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -27,7 +28,8 @@ pub fn make_router(app: App) -> NormalizePath<Router> {
|
||||||
.nest("/api", api::router())
|
.nest("/api", api::router())
|
||||||
.with_state(app.clone())
|
.with_state(app.clone())
|
||||||
.nest_service("/swagger", swagger)
|
.nest_service("/swagger", swagger)
|
||||||
.nest("/", static_files);
|
.nest("/", static_files)
|
||||||
|
.layer(logger::LogLayer::new());
|
||||||
|
|
||||||
NormalizePathLayer::trim_trailing_slash().layer(router)
|
NormalizePathLayer::trim_trailing_slash().layer(router)
|
||||||
}
|
}
|
||||||
|
|
60
src/server/axum/logger.rs
Normal file
60
src/server/axum/logger.rs
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue