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 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
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