diff --git a/spdlog/src/record.rs b/spdlog/src/record.rs index 568835fe..6f64dc91 100644 --- a/spdlog/src/record.rs +++ b/spdlog/src/record.rs @@ -24,7 +24,7 @@ use crate::{Level, SourceLocation}; // possible to correct. #[derive(Clone, Debug)] pub struct Record<'a> { - logger_name: Option<&'a str>, + logger_name: Option>, payload: Cow<'a, str>, inner: Cow<'a, RecordInner>, } @@ -73,7 +73,7 @@ impl<'a> Record<'a> { #[must_use] pub fn to_owned(&self) -> RecordOwned { RecordOwned { - logger_name: self.logger_name.map(|n| n.into()), + logger_name: self.logger_name.clone().map(|n| n.into_owned()), payload: self.payload.to_string(), inner: self.inner.clone().into_owned(), } @@ -81,8 +81,8 @@ impl<'a> Record<'a> { /// Gets the logger name. #[must_use] - pub fn logger_name(&self) -> Option<&'a str> { - self.logger_name + pub fn logger_name(&self) -> Option<&str> { + self.logger_name.as_ref().map(|n| n.as_ref()) } /// Gets the level. @@ -137,7 +137,16 @@ impl<'a> Record<'a> { let args = record.args(); Self { - logger_name: logger.name(), + // If the logger has a name configured, use that name. Otherwise, the name can also be + // given by the target of the log record. + logger_name: logger.name().map(Cow::Borrowed).or_else(|| { + let log_target = record.target(); + if log_target.is_empty() { + None + } else { + Some(Cow::Owned(String::from(log_target))) + } + }), payload: match args.as_str() { Some(literal_str) => literal_str.into(), None => args.to_string().into(), @@ -178,7 +187,7 @@ impl RecordOwned { #[must_use] pub fn as_ref(&self) -> Record { Record { - logger_name: self.logger_name.as_deref(), + logger_name: self.logger_name.as_deref().map(Cow::Borrowed), payload: Cow::Borrowed(&self.payload), inner: Cow::Borrowed(&self.inner), } @@ -246,7 +255,7 @@ impl<'a> RecordBuilder<'a> { /// Sets the logger name. #[must_use] pub(crate) fn logger_name(mut self, logger_name: &'a str) -> Self { - self.record.logger_name = Some(logger_name); + self.record.logger_name = Some(Cow::Borrowed(logger_name)); self } diff --git a/spdlog/tests/log_crate_proxy.rs b/spdlog/tests/log_crate_proxy.rs index f78c6723..21a52ee5 100644 --- a/spdlog/tests/log_crate_proxy.rs +++ b/spdlog/tests/log_crate_proxy.rs @@ -17,7 +17,7 @@ fn test_source_location() { let sink = Arc::new(StringSink::with(|b| b.formatter(formatter))); let logger = Arc::new(build_test_logger(|b| b.sink(sink.clone()))); - spdlog::init_log_crate_proxy().unwrap(); + spdlog::init_log_crate_proxy().ok(); spdlog::log_crate_proxy().set_logger(Some(logger)); log::set_max_level(log::LevelFilter::Trace); @@ -27,3 +27,18 @@ fn test_source_location() { "(log_crate_proxy::log_crate_proxy.rs) text\n" ); } + +#[cfg(feature = "log")] +#[test] +fn test_target() { + let formatter = Box::new(PatternFormatter::new(pattern!("[{logger}] {payload}{eol}"))); + let sink = Arc::new(StringSink::with(|b| b.formatter(formatter))); + let logger = Arc::new(build_test_logger(|b| b.sink(sink.clone()))); + + spdlog::init_log_crate_proxy().ok(); + spdlog::log_crate_proxy().set_logger(Some(logger)); + log::set_max_level(log::LevelFilter::Trace); + + log::info!(target: "MyLogger", "body"); + assert_eq!(sink.clone_string(), "[MyLogger] body\n"); +}