1
0
mirror of https://github.com/fafhrd91/actix-web synced 2025-05-19 07:23:17 +02:00

Implements log_level for Logger middleware (#3605)

* implements log level for Logger

* docs: update changelog

---------

Co-authored-by: Rob Ede <robjtede@icloud.com>
This commit is contained in:
JackSpagnoli 2025-05-10 00:51:47 +01:00 committed by GitHub
parent 65f254d1b2
commit 9bbb5414d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 2 deletions

View File

@ -2,6 +2,7 @@
## Unreleased ## Unreleased
- Add `Logger::log_level()` method.
- Add `HttpServer::shutdown_signal()` method. - Add `HttpServer::shutdown_signal()` method.
- Mark `HttpServer` as `#[must_use]`. - Mark `HttpServer` as `#[must_use]`.
- Re-export `mime` dependency. - Re-export `mime` dependency.

View File

@ -16,7 +16,7 @@ use actix_service::{Service, Transform};
use actix_utils::future::{ready, Ready}; use actix_utils::future::{ready, Ready};
use bytes::Bytes; use bytes::Bytes;
use futures_core::ready; use futures_core::ready;
use log::{debug, warn}; use log::{debug, warn, Level};
use pin_project_lite::pin_project; use pin_project_lite::pin_project;
#[cfg(feature = "unicode")] #[cfg(feature = "unicode")]
use regex::Regex; use regex::Regex;
@ -92,6 +92,7 @@ struct Inner {
exclude: HashSet<String>, exclude: HashSet<String>,
exclude_regex: Vec<Regex>, exclude_regex: Vec<Regex>,
log_target: Cow<'static, str>, log_target: Cow<'static, str>,
log_level: Level,
} }
impl Logger { impl Logger {
@ -102,6 +103,7 @@ impl Logger {
exclude: HashSet::new(), exclude: HashSet::new(),
exclude_regex: Vec::new(), exclude_regex: Vec::new(),
log_target: Cow::Borrowed(module_path!()), log_target: Cow::Borrowed(module_path!()),
log_level: Level::Info,
})) }))
} }
@ -139,6 +141,23 @@ impl Logger {
self self
} }
/// Sets the log level to `level`.
///
/// By default, the log level is `Level::Info`.
///
/// # Examples
/// Using `.log_level(Level::Debug)` would have this effect on request logs:
/// ```diff
/// - [2015-10-21T07:28:00Z INFO actix_web::middleware::logger] 127.0.0.1 "GET / HTTP/1.1" 200 88 "-" "dmc/1.0" 0.001985
/// + [2015-10-21T07:28:00Z DEBUG actix_web::middleware::logger] 127.0.0.1 "GET / HTTP/1.1" 200 88 "-" "dmc/1.0" 0.001985
/// ^^^^^^
/// ```
pub fn log_level(mut self, level: log::Level) -> Self {
let inner = Rc::get_mut(&mut self.0).unwrap();
inner.log_level = level;
self
}
/// Register a function that receives a ServiceRequest and returns a String for use in the /// Register a function that receives a ServiceRequest and returns a String for use in the
/// log line. The label passed as the first argument should match a replacement substring in /// log line. The label passed as the first argument should match a replacement substring in
/// the logger format like `%{label}xi`. /// the logger format like `%{label}xi`.
@ -242,6 +261,7 @@ impl Default for Logger {
exclude: HashSet::new(), exclude: HashSet::new(),
exclude_regex: Vec::new(), exclude_regex: Vec::new(),
log_target: Cow::Borrowed(module_path!()), log_target: Cow::Borrowed(module_path!()),
log_level: Level::Info,
})) }))
} }
} }
@ -312,6 +332,7 @@ where
format: None, format: None,
time: OffsetDateTime::now_utc(), time: OffsetDateTime::now_utc(),
log_target: Cow::Borrowed(""), log_target: Cow::Borrowed(""),
log_level: self.inner.log_level,
_phantom: PhantomData, _phantom: PhantomData,
} }
} else { } else {
@ -327,6 +348,7 @@ where
format: Some(format), format: Some(format),
time: now, time: now,
log_target: self.inner.log_target.clone(), log_target: self.inner.log_target.clone(),
log_level: self.inner.log_level,
_phantom: PhantomData, _phantom: PhantomData,
} }
} }
@ -344,6 +366,7 @@ pin_project! {
time: OffsetDateTime, time: OffsetDateTime,
format: Option<Format>, format: Option<Format>,
log_target: Cow<'static, str>, log_target: Cow<'static, str>,
log_level: Level,
_phantom: PhantomData<B>, _phantom: PhantomData<B>,
} }
} }
@ -390,6 +413,7 @@ where
let time = *this.time; let time = *this.time;
let format = this.format.take(); let format = this.format.take();
let log_target = this.log_target.clone(); let log_target = this.log_target.clone();
let log_level = *this.log_level;
Poll::Ready(Ok(res.map_body(move |_, body| StreamLog { Poll::Ready(Ok(res.map_body(move |_, body| StreamLog {
body, body,
@ -397,6 +421,7 @@ where
format, format,
size: 0, size: 0,
log_target, log_target,
log_level,
}))) })))
} }
} }
@ -409,6 +434,7 @@ pin_project! {
size: usize, size: usize,
time: OffsetDateTime, time: OffsetDateTime,
log_target: Cow<'static, str>, log_target: Cow<'static, str>,
log_level: Level
} }
impl<B> PinnedDrop for StreamLog<B> { impl<B> PinnedDrop for StreamLog<B> {
@ -421,8 +447,9 @@ pin_project! {
Ok(()) Ok(())
}; };
log::info!( log::log!(
target: this.log_target.as_ref(), target: this.log_target.as_ref(),
this.log_level,
"{}", FormatDisplay(&render) "{}", FormatDisplay(&render)
); );
} }