spdlog-rs 0.5.3

Fast, highly configurable Rust logging crate, inspired by the C++ logging library spdlog
Documentation
use std::sync::{Arc, Mutex};

use spdlog::{
    formatter::{pattern, PatternFormatter},
    __EOL,
};

include!(concat!(
    env!("OUT_DIR"),
    "/test_utils/common_for_integration_test.rs"
));
use test_utils::*;

static GLOBAL_LOG_CRATE_PROXY_MUTEX: Mutex<()> = Mutex::new(());

#[cfg(feature = "log")]
#[test]
fn test_source_location() {
    let formatter = PatternFormatter::new(pattern!("({module_path}::{file_name}) {payload}{eol}"));
    let sink = Arc::new(StringSink::with(|b| b.formatter(formatter)));
    let logger = Arc::new(build_test_logger(|b| b.sink(sink.clone())));

    let _guard = GLOBAL_LOG_CRATE_PROXY_MUTEX.lock().unwrap();
    _ = spdlog::init_log_crate_proxy();
    spdlog::log_crate_proxy().set_logger(Some(logger));
    log::set_max_level(log::LevelFilter::Trace);

    log::info!("text");
    assert_eq!(
        sink.clone_string(),
        format!("(log_crate_proxy::log-crate-proxy.rs) text{__EOL}")
    );
}

#[cfg(feature = "log")]
#[test]
fn test_target() {
    let formatter = 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())));

    let _guard = GLOBAL_LOG_CRATE_PROXY_MUTEX.lock().unwrap();
    _ = spdlog::init_log_crate_proxy();
    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(), format!("[MyLogger] body{__EOL}"));
}

#[cfg(feature = "log")]
#[test]
fn test_kv() {
    let formatter = PatternFormatter::new(pattern!("{payload} {{ {kv} }}{eol}"));
    let sink = Arc::new(StringSink::with(|b| b.formatter(formatter)));
    let logger = Arc::new(build_test_logger(|b| b.sink(sink.clone())));

    let _guard = GLOBAL_LOG_CRATE_PROXY_MUTEX.lock().unwrap();
    _ = spdlog::init_log_crate_proxy();
    spdlog::log_crate_proxy().set_logger(Some(logger));
    log::set_max_level(log::LevelFilter::Trace);

    log::info!(key1 = 42, key2 = true; "a {} event", "log");
    assert_eq!(
        sink.clone_string(),
        format!("a log event {{ key1=42 key2=true }}{__EOL}")
    );
}